第3章:Web漏洞深度追问与回答框架
本章聚焦渗透测试面试中最高频的 Web 漏洞 题目。面试官不仅考察漏洞原理,更关注你的 实战链路、绕过思路 和 修复建议。掌握结构化回答框架,能让你的表述更自信、更专业。
💡 核心原则:任何漏洞回答都应覆盖 原理 → 检测 → 利用 → 绕过 → 修复 五步闭环。
高频漏洞知识矩阵
以下表格对比三大经典漏洞的面试核心,帮助快速建立知识肌肉记忆:
| 漏洞类型 | 原理关键词 | 检测方法 | 利用难度 | 修复建议 |
|---|---|---|---|---|
| SQL注入 | 未过滤参数拼接SQL语句 | 单引号/时间盲注/报错注入 | 中 | 参数化查询 <pre><code>prepare</code></pre> |
| XSS | 反射/存储/DOM型 | <img src=x onerror=alert(1)> | 低(可利用性高) | 输出编码 + CSP |
| 文件上传 | 后缀/Content-Type/MIME绕过 | 上传webshell + 访问路径 | 中高(取决于绕过) | 白名单后缀 + 图片重编码 |
🧠 面试官心理:你不需要背出所有细节,但必须展示“我做过、我踩过坑、我知道怎么防”。
🎯 问答卡片 1:SQL注入如何手工检测?
面试问题:请描述如何手工检测一个可能存在SQL注入的GET参数?
面试官考察点:
- 是否真的一步步手工测过(不仅仅是跑sqlmap)
- 对闭合、报错、盲注的理解深度
- 安全意识:能否在先确认注入点再考虑利用
回答框架:
- 输入单引号
'观察报错或异常 - 尝试注释符号
--+或#判断闭合 - 使用
and 1=1 / and 1=2布尔盲注 - 时间盲注
sleep(5)确认无回显场景 - 结合
order by猜字段数
简短示例回答(约80字):“我首先在参数后加单引号,看是否报错或页面变化;再尝试注释符还原SQL;然后用and 1=1、and 1=2对比页面差异,确认存在布尔注入;若没有回显,我会用sleep(5)做时间盲注确认;最后通过order by确定字段数,为后面union查询打基础。”
可能追问:
- 如果页面完全无变化(包括时间)怎么办?
- 遇到WAF拦截单引号,你用什么绕过?
- 如何区分是注入点还是正常业务参数?
⚠️ 避坑提醒:不要一上来就说“用sqlmap”,手工检测是面试必考点。另外注意不要修改数据库数据(慎用into outfile),展示伦理意识。
🎯 问答卡片 2:存储型XSS与反射型XSS的区别及防御
面试问题:请说明存储型XSS和反射型XSS的本质区别,以及各自的防御要点。
面试官考察点:
- 是否理解“存储≠反射”的核心是数据持久化
- 能否结合业务场景说明危害
- 防御策略是否分层(输入+输出)
回答框架:
- 定义:存储型存到数据库/文件,每次访问触发;反射型仅一次请求
- 危害:存储型影响所有用户(如论坛),反射型需诱导点击
- 输入侧:富文本过滤白名单标签,普通文本HTML实体编码
- 输出侧:根据上下文做编码(HTML/JS/URL)
- 额外:CSP头部限制脚本来源
简短示例回答(约90字):“存储型XSS把恶意脚本持久化在服务端,比如评论区,每个访问者都会执行;反射型则通过URL参数反射,一次有效。防御上,我对所有用户输入做白名单过滤或实体编码,输出时根据上下文编码,同时配置Content-Security-Policy限制内联脚本。不能只依赖一种方式。”
可能追问:
- 如果业务需要允许用户输入HTML标签怎么办?
- CSP如何配置?哪些指令最有效?
- DOM型XSS和存储/反射有什么关系?
⚠️ 避坑提醒:千万不要说“过滤