为什么SQL注入修复后仍被绕过_检查是否存在多重编码解码问题

P粉602998670

P粉602998670

2026-05-02

308人浏览

原创

sql注入修复后仍被绕过,大概率因多层解码(如重复urldecode、嵌套base64_decode)或字符集错配导致过滤/参数化逻辑失效,防御关键是在所有解码完成后、且仅一次地执行参数化查询。

为什么sql注入修复后仍被绕过_检查是否存在多重编码解码问题

修复SQL注入后仍被绕过,大概率不是漏写了某个WHERE条件,而是请求在抵达SQL执行点前,经历了多次编码/解码,导致过滤或参数化逻辑被跳过——比如urldecode()调用两次、base64_decode()嵌套、或前端URL编码 + 后端自动解码 + 手动再解一次。

检查是否有多层URL解码(尤其是urldecode()重复调用)

PHP中$_GET$_POST默认已由SAPI层完成一次URL解码,若代码里又手动调用urldecode(),就会触发二次解码。攻击者用%2527(即%27的URL编码)就能绕过单引号过滤:

  • %2527 → SAPI第一次解码 → %27 → 手动urldecode()第二次解码 → '
  • 但你的过滤逻辑(如str_replace("'", '', $input))可能只跑在第一次解码后的字符串上,对%27完全无感
  • 常见误写:$id = urldecode($_GET['id']); $id = addslashes($id); —— 这里addslashes()作用对象已是%27,不是'

确认Base64解码是否发生在参数化之前

如果用户传data=Ym9yIDE9MQ==,而你写的是$raw = base64_decode($_POST['data']); $stmt->bind_param('s', $raw);,看似安全——但问题在于:这个$raw是否在绑定前被用于其他上下文?比如日志记录、缓存键生成、或拼进另一条非参数化语句?

Android编码规范 中文WORD版
Android编码规范 中文WORD版

本书讲述的是Android编码规范;有需要的朋友可以下载看看

下载
  • Base64本身不改变语义,Ym9yIDE9MQ==解码后就是or 1=1,和明文输入无异
  • 更危险的是递归解码:若前端JS用btoa(btoa("or 1=1")),后端却写base64_decode(base64_decode($input)),就直接触发注入
  • 检查所有base64_decode()调用点,确认它只出现在绑定参数的路径上,且仅执行一次

排查字符集转换引发的“隐形解码”

MySQL连接层的SET NAMES、PDO的PDO::MYSQL_ATTR_INIT_COMMAND、或mysqli_set_charset()若与实际传输内容编码不一致,会导致数据库把字节流错误解释为字符——比如UTF-8下%C0%BC(无效UTF-8序列)被MySQL按latin1解析成¼,而某些WAF规则只查UTF-8的',就漏掉了。

  • 统一全链路编码:HTML声明<meta charset="utf-8">、HTTP头Content-Type: text/html; charset=utf-8、PHP连接时显式设置set_charset('utf8mb4')、MySQL服务端配置character-set-server=utf8mb4
  • 避免依赖mysql_real_escape_string()(已废弃),它内部会读取当前连接字符集,一旦错配,转义就失效
  • bin2hex()临时打印接收到的原始字节,对比你认为的“解码后字符串”,看是否有意外的字节重组

真正棘手的绕过,往往藏在“多一步解码”或“少一步约束”里——比如你以为json_decode()后的内容是干净的,但它里面某个字段值其实是Base64编码的SQL片段,而你忘了对那个字段再做参数化;或者WAF放行了%2527,因为它的规则只扫描第一层解码结果。防御的关键不是堆砌编码,而是明确每一步解码发生的时机、位置和目的,并确保参数化查询的bind_param()execute()调用,永远在所有解码动作完成之后、且仅此一次。

相关专题

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

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

2023.10.12

2474

8

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

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

2023.10.27

449

4

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

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

2024.02.23

615

5

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

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

2024.03.06

3991

10

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

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

2024.03.06

1347

4

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

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

2024.04.07

3563

11

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

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

2024.04.29

3537

6

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

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

2024.04.29

642

5

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

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

2024.04.29

526

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Fitten Code官方手册
Fitten Code官方手册

共0课时 | 0人学习

CodeGeex使用手册
CodeGeex使用手册

共0课时 | 0人学习

通义灵码手册
通义灵码手册

共0课时 | 0人学习