第4章 Web漏洞原理:SQL注入、XSS、CSRF
本章聚焦面试中最高频的三大Web漏洞。面试官通过这些问题考察你对漏洞本质的理解深度、变种识别能力以及防御实践经验。掌握"原理→变种→检测→防御"四步回答框架,可以应对90%的Web漏洞追问。
| 对比维度 | SQL注入 | XSS | CSRF |
|---|---|---|---|
| 漏洞本质 | 数据拼接到SQL语句,改变语义 | 数据被当作脚本在浏览器执行 | 冒用用户身份发起恶意请求 |
| 攻击位置 | 服务端数据库 | 客户端浏览器 | 服务端接口(利用登录态) |
| 常见变种 | 联合/报错/布尔盲/时间盲/堆叠 | 反射型 / 存储型 / DOM型 | GET型 / POST型 / 绕过 |
| 检测方式 | 单引号闭合 + 逻辑判断 | 脚本标签测试 + 事件处理器 | Referer检查 + 验证 |
| 防御核心 | 预编译 + 参数化查询 | 输出编码 + CSP策略 | CSRF + SameSite Cookie |
▎面试问题 1:SQL注入的原理及常见变种?如何检测与防御?
🎯 面试官考察点
是否理解SQL注入的本质(改变SQL语义);能否列举3种以上真实变种;检测与防御方案是否具备落地细节。
📐 回答框架
- 原理:用户输入未过滤,拼接到SQL语句中改变语义;
- 变种:联合查询 / 报错注入 / 布尔盲注 / 时间盲注 / 堆叠注入;
- 检测:单引号闭合测试 → 逻辑判断确认 → 自动化工具验证;
- 防御:预编译 + 参数化查询(首选),辅以输入过滤和WAF。
✏️ 示例回答
"SQL注入是将用户输入拼接到SQL语句中改变原有语义。常见变种有联合查询、报错注入、布尔盲注、时间盲注和堆叠注入。检测时先用单引号测试闭合,再用逻辑判断确认注入点。防御核心是使用预编译和参数化查询,辅以输入过滤和WAF层防护。"
🔍 可能追问
• 如何绕过WAF检测SQL注入?(注释符、编码混淆、分块传输)
• 二次注入的原理是什么?与普通注入有何区别?
• 预编译为什么能防御SQL注入?底层机制是怎样的?
⚠️ 避坑提醒
• 不要只背概念,要演示具体payload构造思路(如单引号、双引号、括号闭合的差异);
• 区分不同数据库的注入语法(MySQL的-- 、Oracle的--、SQL Server的;--)。
▎面试问题 2:XSS的原理是什么?有哪些类型?如何有效防御?
🎯 面试官考察点
是否清晰区分反射型/存储型/DOM型;对CSP策略的落地细节;是否理解输出编码比输入过滤更重要。
📐 回答框架
- 原理:未过滤数据被浏览器当作脚本执行(前端注入);
- 分类:反射型(一次性)、存储型(持久化)、DOM型(客户端);
- 检测:
<script>alert(1)</script>+ 事件处理器测试; - 防御:输出编码(HTML实体/JS编码)+ Content-Security-Policy 策略。
✏️ 示例回答
"XSS是前端注入攻击,用户输入被当作脚本执行。分反射型、存储型和DOM型三类:反射型需诱导点击,存储型持久在服务器端,DOM型在客户端触发。检测用'<script>alert(1)</script>'测试。防御核心是输出编码加Content-Security-Policy策略,从源头阻断脚本执行。"
🔍 可能追问
• 如何绕过CSP防御执行XSS?(寻找CDN白名单、JSONP劫持)
• DOM型XSS与反射型XSS的本质区别是什么?
• 你使用过哪些XSS平台?如何利用XSS获取Cookie?
⚠️ 避坑提醒
• 不要混淆DOM型与反射型:DOM型完全在客户端通过JS动态渲染产生,不经过服务端;
• 强调防御核心是输出编码而非输入过滤,因为业务场景往往需要允许HTML标签。
▎面试问题 3:CSRF的原理是什么?与XSS有什么区别?如何防御?
🎯 面试官考察点
是否理解CSRF"冒用身份"的本质;能否清晰区分CSRF与XSS;防御方案是否包含绑定会话。
📐 回答框架
- 原理:攻击者利用用户已登录身份,发起恶意请求(信任请求);
- 区别:XSS信任用户输入(注入脚本),CSRF信任请求(冒用身份);
- 检测:检查Referer来源 + 验证是否与会话绑定;
- 防御:CSRF (每个请求唯一)、SameSite Cookie(Strict/Lax)、二次确认。
✏️ 示例回答
"CSRF利用用户已登录身份发起恶意请求。与XSS不同:XSS是注入恶意代码到页面,CSRF是冒用身份发起请求。防御标准方案是CSRF 验证请求来源,配合Set-Cookie的SameSite属性设为Lax或Strict,关键操作再加二次确认。"
🔍 可能追问
• 如果CSRF 被泄露,有什么补救措施?
• SameSite属性的Strict、Lax、None三者的区别是什么?
• 如何测试CSRF漏洞?构造POC时需要注意什么?
⚠️ 避坑提醒
• 不要混淆CSRF与SSRF:CSRF是客户端请求伪造,SSRF是服务端请求伪造;
• 强调必须与用户会话绑定且每次请求不同,否则可被复用攻击。
▎项目案例实战模板
📁 项目名称:金融核心交易系统 Web 安全评估
| 业务背景 | 某金融科技公司核心交易系统上线前安全评估,需通过等保三级认证,业务涉及用户注册、充值、交易、提现等完整资金链路。 |
| 规模指标 | 200+ API接口,50+ Web页面,注册用户10万+,日交易额约500万元,峰值QPS 3000+。 |
| 技术栈 | Spring Boot + Vue.js + MySQL + Redis + Nginx + 自研RPC框架 |
| 核心难点 | ① 自定义参数加密协议逆向分析;② 业务逻辑漏洞挖掘(订单金额篡改、优惠券重复使用、越权查看他人订单);③ 反序列化漏洞链利用与RCE提权。 |
| 面试高频追问 | • 如何发现业务逻辑漏洞?请结合该案例说明。 • SSRF与CSRF在该系统中如何联动利用? • 如何绕过前端参数签名校验? |
| 可迁移回答话术 | "在金融类项目中,我总结出'正向梳理业务流 + 逆向测试边界'的方法论。正向梳理时关注订单、支付、优惠券等核心链路;逆向测试时重点突破参数篡改、越权访问和状态绕过。该方法帮助我在该项目中发现3个高危逻辑漏洞,包括订单金额篡改和优惠券重复使用。" |
💡 面试加分提示
项目案例回答时,使用 STAR 原则(情境-任务-行动-结果)组织语言,先交代业务背景和规模,再讲你如何发现和利用漏洞,最后说明修复方案和业务价值。数字指标(接口数、用户量、QPS)能显著提升回答的可信度。