为什么简单的关键词过滤无法阻挡SQL注入_利用十六进制编码绕过检测的对策

落涛酱_5786

落涛酱_5786

2026-06-25

402人浏览

原创

根本原因是十六进制编码绕过关键词过滤,因其作为数据库原生字面量不经过字符串解析阶段,waf仅做请求体扫描而未还原语义导致失效。

为什么简单的关键词过滤无法阻挡sql注入_利用十六进制编码绕过检测的对策

简单的关键词过滤挡不住十六进制编码的 SQL 注入,根本原因不是“漏了某个关键字”,而是它完全跳出了字符串匹配的逻辑边界——0x61646D696E 不是 "admin",它甚至不是字符串,而是数据库原生支持的字面量类型。

MySQL 中 0x 前缀字面量不经过字符串解析阶段

当 MySQL 解析 WHERE name = 0x61646D696E 时,0x61646D696E 在语法分析早期就被识别为 BINARY 字面量,直接转成字节序列 b'admin',后续不再走引号包裹字符串的路径。这意味着:

  • 所有基于“检测 'admin'”或“拦截 select”的正则规则,对 0x... 完全失效
  • WAF 若只做请求体关键词扫描,而没做数据库语义层还原,就等于在解析前一层拦了个寂寞
  • UNHEX('61646D696E')CONV('61646D696E',16,10) 等函数调用同理,它们属于函数调用节点,不是字符串字面量

检测必须分两层:先抓模式,再验语义

只靠正则扫 0x[0-9a-fA-F]{2,} 还远远不够。真实攻击中常见混淆手段包括大小写混用、中间插入空格(0x 61 64 6D)、换行、甚至 URL 编码后的 0x253735(即 %75 的 HEX)。所以检测需拆解为:

Reddo
Reddo

一款AI视频创作工具,主要用于Reddo产品搜索引擎,说出需求,直达产品/游戏/工具/公司/工作/文章/视频/商品,适合需要提升相关任务效率的用户。

下载
  • 第一层(语法提取):用正则捕获所有可疑 HEX 模式,包括 0x[0-9a-fA-F\s\n\r\t]{2,}0X[0-9a-fA-F\s\n\r\t]{2,}UNHEX\([^)]+\)CONV\([^)]+\)
  • 第二层(语义校验):对每个提取出的 HEX 内容做清洗(去空格/换行/制表符),再检查:
    • 长度是否为偶数
    • 是否只含 0-9a-fA-F
    • 能否通过 bytes.fromhex() 成功解码(不抛 ValueError
    • 解码后首字节是否为控制字符(如 0x27 单引号、0x3B 分号、0x20 空格)

URL 解码时机错位导致检测失效

很多防护逻辑默认“原始请求体 = 最终输入”,但实际链路中:id=0x61646D696E 经 Nginx 或 Spring WebMvc 处理后,可能被提前解码为字节流,后端收到的是二进制 b'\x61\x64\x6d\x69\x6e',而非字符串 "0x61646D696E"。此时:

  • 日志里看到的是已解码内容,但 WAF 规则还在原始请求体上跑正则,自然漏掉
  • 若业务代码用 String.getBytes(StandardCharsets.UTF_8) 再拼 SQL,就可能把二进制误当作 UTF-8 字符串,产生乱码或截断,反而掩盖了攻击痕迹
  • 正确做法是:在请求进入业务逻辑前,统一做一次“反向 HEX 还原”——即把所有疑似 HEX 字面量按数据库规则尝试还原,并记录还原结果供后续策略判断

真正难处理的不是 0x61646D696E 本身,而是它和 UNHEXCHAR、大小写混淆、多字节空格混用在一起时,检测点会分散在协议层、Web 容器层、框架层、SQL 解析层多个位置——任何一层脱节,整个防线就形同虚设。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3743

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

791

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

969

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5501

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2503

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5500

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7161

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

970

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

852

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.2万人学习

CodeIgniter 4 官方用户指南
CodeIgniter 4 官方用户指南

共0课时 | 0人学习