Skip to content
Kurisu
Go back

SQL 注入绕过手册:从空格逗号到雷池 WAF 的分层思路

基础系列只提了一句绕过,WAF 绕过笔记是从防守方视角写的。这篇按课堂顺序整理注入侧的绕过分类学——先分清”哪些绕过已经死了”,再学”为什么还活着的那些能活”。

0x01 五类基础绕过速查(面试必备,实战多已失效)

被过滤等价替换
空格/**/ 注释、%0a %0b %09(换行/制表)、括号包裹
引号十六进制字面量(0x61646D696E 代替 'admin'
逗号JOIN 替代 UNION SELECTsubstr(str FROM 1 FOR 1) 替代 substr(str,1,1)LIMIT 1 OFFSET 0 替代 LIMIT 0,1
大小写Or/oR/And 变形;关系运算符 > < = 替代 AND/OR 逻辑
函数名substrMID/LEFT/RIGHT;同类功能函数替换

双写绕过针对”replace 删除式过滤”:过滤 and 时输入 anandd,删除中间的 and 剩下 and;过滤 oniinformationn_schema 同理。适用前提是单轮 replace 无循环

课上把边界说得直接:这五类在 Fly Lab 21-30 关练完就该放下——现代 WAF 面前基本全失效,但面试仍会问,因为它们考察的是”你知不知道过滤发生在哪一层”。

0x02 还活着的手法

内联注释与正则回溯

MySQL 方言 /*!50000and*/ 内联注释在部分拦截规则下可过;更有通用性的是正则回溯(上次反序列化篇讲过的机制在注入上的应用):WAF/后端用 preg_match 检测时,垫百万级字符耗尽 pcre.backtrack_limit,检测函数返回 false 被当成”未匹配”——真实案例里正是靠它过了拦截拿到管理员数据。

十六进制子查询

引号被拦时,把整个子查询结果以十六进制传递再 unhex 还原,绕开对引号内容的全量检测。

为什么”塞垃圾字符撑爆长度限制”不现实

有人建议在注入语句前塞几万字符指望 WAF 因长度限制放行后半段。课堂判断很明确:专业 WAF 处理几万字符无压力,这条路对现代产品无效——但对自己写的简陋过滤脚本strlen 判断那种)有时真能过,知道即可,别当主力。

0x03 雷池与长亭系 WAF 的绕过策略

课堂用雷池旧版本做了复现,策略层总结三条:

  1. 找解析差异而非规则漏洞:WAF 和后端对同一 payload 的解码不一致(URL 二次编码、分块传输、参数污染 ?id=1&id=2)才是高价值点,“变形关键词”是低价值点;
  2. 检测引擎的资源模型:正则引擎有回溯上限、静态引擎靠关键词匹配——上一条的正则回溯就是打资源模型;
  3. 绕不开就走别的口:WAF 拦 GET 注入点就转 POST 注入点;主站拦截就找不做防护的子域/内部系统——实战案例里”主站 412 拦截→换突破面”是标准操作。

雷池的部署和拦截分析我之前写过:云服务器部署雷池 WAF + HFish,两边对照着看,攻防视角就闭环了。

0x04 面试视角

相关旧文


Share this post:

Previous Post
SSRF 深入利用:gopher 打 Redis 三板斧与 Session 反序列化 RCE
Next Post
无字母数字 RCE:16 字符限制下的命令执行全解