尝试直接让id=1试一试 右下角显示的执行时间为2秒钟,而我们让他延迟的时间是五秒钟,很显然我们输入的语句没有成功注入,所以我们得在1后面加上字符使其闭合
执行时间是七秒钟,七秒钟减去两秒钟正好是我们设置的五秒钟,语句是正确的,显然可以使用单引号闭合
知道了if()函数的使用方法,你不妨自己尝试一下构造语句先来判断当前数据库名字符长度
?id=1' and if((length(database())>7),sleep(5),1)--+
你成功了吗,这句sql语句的意思即如果当前数据库名长度大于7,则延迟执行5秒,而这个1并没有什么作用,只是因为if()函数的使用格式需要在这放一个数值,所以改成任何数字都可以
当前数据库名的第一个字母是s,这个时候我们可以凭经验直接猜全名,如果和我们猜到都不一样当然还得一个一个的继续猜
猜对了,是security,接下来猜其他的数据库名(假设我们有这个需要),自己构造一下吧
?id=1' and if((substr((select schema_name from information_schema.schemata limit 0,1),1,1)>'a'),sleep(5),1)--+
猜半天搞出来个in 不用想了,直接猜他就是information_schema
果然如此,接下来将limit 0,1换成limit 1,1就可以继续猜第二个数据库名了(有这个需要的话)
长度为6,不用想,肯定是emails
?id=1' and if((substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,6)='emails'),sleep(5),1)--+
第二个字段长度是8,不是username就是password,冲啊
猜对了,那第三字段盲猜一下是password
?id=1' and if((substr((select column_name from information_schema.columns where table_name='users' limit 2,1),1,8)='password'),sleep(5),1)--+
没毛病,接下来获取username和password两个字段里面的内容
密码这边第一个也是dumb
到这里对if()函数,sleep()函数的学习勉强到位了
尝试学习一下benchmark()函数的使用,你可能有点疑惑,这个比单纯的使用sleep()函数还要麻烦,为什么要使用这个函数呢?呵呵,这个我也不清楚,但是我觉得会有一种情况benchmark()函数能用的上,比如说当if()不能使用的时候,这里简单介绍一下这种情况下我们怎样去使用benchmark()函数吧
security的长度是8,减去7就是1,会返回sleep(5)执行一次的时间,大概就是7s(多出来的2s不用管,因为语句没有执行的页面返回时间就是2s)
语句成功执行的页面返回时间-语句未执行的页面返回时间=你设置的延迟时间
假如我们不知道当前数据库名长度怎么办呢,这个不难,就是有点费时
看到了吧42s 那么长度大概就是8 (42-2)/5=8 直接得出来长度了都,你还敢说比用if()麻烦吗
ps:有亿点点费时,搞得不好你自己的网站先崩,要是实战就更惨了,注入给人家网站注崩了
你可能又要说了,那你为什么不把sleep()设置的延迟时间短一点呢,比如就设1s 那就试一试
你说的没错,网络稳定的情况下这是一个好办法,但是网络不稳定的情况下,设置的延迟时间越短那么正确度就越低,能明白我意思吧 让我们猜的字母转化为ASCII值再减去某个数,根据页面返回时间就能确定我们猜的字母具体是哪个(网络稳定的情况下),这里看到sleep(5)执行了一次,那么当前数据库名的第一个字母的ASCII值就是115,那就是s (这里附上一个简单的大小写字母ASCII值对照表)
第一个表名长度是6(注意这里是sleep(1)) 第二个表名长度是8
.。。。。。。。。。。。。。。。。。。。。。。。(省略的猜解过程)
?id=1' and benchmark((ascii(substr((select password from users limit 0,1),4,4))-97),sleep(5))--+
password字段的第一个数据的最后一位的ASCII值是98 那就是b
综合省略的过程中猜解的数据,我们已经得到了一个账号和一个密码即dumb和dumb
关于benchmark()函数的简单使用到此为止,谢谢观看