第3章:高级Web漏洞利用与WAF绕过
章节导读
本章聚焦渗透测试技术专家岗位在高级Web漏洞利用与WAF绕过场景下的面试考核重点。面试官不仅关注你对漏洞原理的掌握,更看重对抗环境下的绕过思维、协议层理解深度以及实战中的调试与排错能力。
公司侧重点
| 公司类型 | 考核侧重点 | 典型追问方向 |
|---|---|---|
| 头部互联网安全团队 | 自研WAF绕过、多协议组合利用、业务逻辑与漏洞结合 | 如何绕过阿里云/腾讯云WAF?如何利用WebSocket实现SQL注入? |
| 安全厂商/红队 | 0day利用思路、资产测绘与精准打击、反蜜罐绕过 | 如何利用分块传输绕过?怎么通过时间差绕过速率限制? |
| 金融/电商自建SRC | 业务安全结合渗透、多因素认证绕过、接口权限提升 | 如何绕过JWT签名认证?怎么利用SSRF结合云元数据获取凭证? |
面试官画像
- 技术深度型:喜欢追问HTTP协议细节、编码底层、数据库特性,会现场要求你构造payload并解释每一步。
- 实战型:直接给出一个被WAF拦截的场景,要求你口头演示绕过过程,并说出为何该手法能生效。
- 压力型:连续追问“如果这样不行呢?再试一种方法”,考察应急思维和知识储备广度。
本章核心回答框架图
问答卡片1:分块传输绕过WAF注入
面试问题:请描述如何利用HTTP分块传输(Chunked Transfer Encoding)绕过WAF实现SQL注入?
面试官考察点:对HTTP协议底层编码理解、分块传输与WAF解析差异的掌握、实际动手能力。
回答框架:
- 解释分块传输原理:每个分块前有长度字段,WAF通常解析完整body,但分块出现Transfer-Encoding时解析可能出错。
- 构造恶意分块:将SQL payload拆成多个分块,使WAF无法还原完整语义,但后端解块后正常执行。
- 演示关键点:使用工具如Burp插件chunked-coding-converter,或手动修改发送原始请求。
- 说明限制:只适用于使用Transfer-Encoding: chunked的请求,部分CDN会清除该头。
简短示例回答:“我曾在某SRC测试中使用分块传输绕过WAF。正常请求被拦截,我加设Transfer-Encoding: chunked并将payload按字符拆分,例如字段长度写为1,每块只传一个字符,再加上结尾块。WAF只检测到零散字符未触发规则,后端拼接后成功注入,获取到数据库版本。”
可能追问:
- “如果后端是PHP+Apache,分块传输还能用吗?为什么?”
- “如何处理同时有Content-Length和Transfer-Encoding的请求?哪个优先级高?”
- “能否通过分块传输绕过RCE类产品的检测?”
避坑提醒:不要只背概念,面试官会要求你现场构造一个分块请求示例。提前记住格式:
1\r\n;\r\n...0\r\n\r\n。另外必须说明分块传输在某些代理(如Nginx)下会被正常转发但WAF可能截断,实际绕过率并非100%。问答卡片2:HPP参数污染绕过检测
面试问题:请简述什么是HTTP参数污染(HPP),并举例说明如何用它绕过WAF对敏感参数的过滤?
面试官考察点:对参数解析机制的理解、不同容器处理多参数时的差异、创造性绕过思维。
回答框架:
- 定义HPP:在同一请求中发送多个同名参数,不同框架/后端会取第一个、最后一个、拼接或组成数组。
- 绕过场景:攻击参数被WAF扫描到,但利用前后端解析差异使WAF看到的参数值和后端看到的不同。
- 举例:Tomcat取最后一个参数,WAF取第一个;或利用参数名大小写绕过特定规则。
- 与其他手法结合:如配合JSON参数劫持、参数编码。
简短示例回答:“在一次渗透中,目标WAF对id参数有严格过滤。我发送?id=1&id=1 union select 1,2,3,WAF解析到第一个id=1认为是安全值放行,而Tomcat取最后一个id导致注入成功。后来我验证了后端使用getParameterMap时确实取最后一个,成功绕过。”
可能追问:
- “如何确定目标后端使用的是哪个容器(Tomcat/JBoss/WebLogic)并推断参数处理规则?”
- “如果后端将所有同名参数拼接成逗号分隔字符串,如何利用?”
- “HPP在HTTP POST body中是否同样有效?请说明区别。”
避坑提醒:不要只谈HPP理论而不提具体容器差异。面试高分关键在于你能口头演示:先发一个正常请求观察响应,再发多个同名参数对比结果,从而推断后端行为。同时要提醒自己注意参数名大小写、URL编码等组合。
问答卡片3:宽字节注入绕过addslashes
面试问题:请描述宽字节注入的原理,以及在现代PHP+MySQL环境下是否仍然有效?
面试官考察点:对字符编码与转义机制的理解深度、GBK与UTF-8的区别、实际环境变化。
回答框架:
- 原理:使用GBK编码时,高字节(如0xbf)后面跟单引号(0x27)会被系统自动转义成0xbf5c,0x5c是反斜杠,而0xbf5c恰好构成一个合法宽字符,使单引号逃逸。
- 典型payload:
?id=%bf%27或?id=%df%27。 - 现代有效性:需要满足三个条件——数据库连接使用GBK(或兼容GBK的编码)、PHP使用addslashes或magic_quotes(已废弃)、以及查询语句中单引号被转义但宽字节可逃逸。
- 建议转向:现在网站在UTF-8下居多,可以改用二次注入、编码绕过或利用其他函数。
简短示例回答:“我在一个老CRM系统中遇到注入点,参数被addslashes处理。我确认数据库字符集为GBK后,传入%df%27,addslashes转义后变成%df%5c%27,而%df%5c构成汉字‘縗’,剩下的单引号闭合成功,最终爆出数据。但在新项目中UTF-8已无法利用此方法,需改用其他绕过思路。”
可能追问:
- “如果数据库是GBK但PHP使用mysqli_real_escape_string,宽字节绕过是否仍有效?为什么?”
- “能否用宽字节绕过preg_replace的转义?举例说明场景。”
- “除了GBK,还有哪些编码可能引发类似问题?比如SJIS、BIG5?”
避坑提醒:面试官经常质疑“宽字节注入已过时”,你的回答必须强调条件限制并展现你对现代防御的认识。正确的策略是:先说明宽字节原理,再指出其适用局限性,最后补充在当前环境下如何通过二次注入或参数类型混淆达到同样效果。
回答框架总结
| 步骤 | 关键动作 | 示例 |
|---|---|---|
| 1. 定位WAF检测点 | 发正常payload确认拦截,使用错误payload定位规则 | 发送1' OR 1=1--返回403 |
| 2. 分析解析差异 | 判断WAF是正则/语义/机器学习类,选择协议/编码/逻辑绕过 | 正则类用注释嵌套、语义类用HPP |
| 3. 选用绕过手法 | 选择分块/参数污染/宽字节/Unicode转换/请求走私等 | 分块传输绕过WAF对body的扫描 |
| 4. 验证并收尾 | 成功绕过后再做信息获取,并记录绕过方法以便复用 | 发现绕过后可自动化编写工具 |
| 5. 防御建议 | 主动给出如何修复此类绕过(加分项) | 限制Transfer-Encoding、使用参数白名单 |
专家提示:面试时不要只展示一种绕过方法,而是展示对抗思维链:A方法被阻断 → 分析阻断原因 → 切换B方法 → 继续分析。面试官更看重你的分析过程而不是最终payload。