Web安全五大漏洞攻防实战与面试指南
1. Web安全工程师面试核心考点解析
作为从业十年的安全工程师,我面试过上百名候选人,发现80%的求职者在Web安全基础问题上栽跟头。今天我们就来深度拆解面试必考的五大漏洞类型:SQL注入、XSS、CSRF、SSRF和XXE。这些知识点不仅是面试高频考点,更是日常安全防护的重中之重。
2. SQL注入攻防实战
2.1 注入原理与危害
SQL注入的本质是通过构造特殊输入,改变原始SQL语句的逻辑结构。去年某电商平台就因订单查询接口存在注入漏洞,导致百万用户数据泄露。常见攻击手法包括:
- 联合查询注入:
' UNION SELECT username, password FROM users-- - 布尔盲注:
admin' AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables))-- - 时间盲注:
1'; IF(SYSTEM_USER='sa') WAITFOR DELAY '0:0:5'--
2.2 防护方案对比
| 防护方案 | 原理 | 适用场景 | 优缺点 |
|---|---|---|---|
| 预编译语句 | SQL与参数分离 | 所有数据库操作 | 100%防注入,需改造代码 |
| 存储过程 | 业务逻辑封装在数据库 | 复杂业务场景 | 性能好,维护成本高 |
| ORM框架 | 对象关系映射 | 新项目开发 | 开发快,学习曲线陡 |
| 输入过滤 | 关键字黑名单 | 遗留系统临时方案 | 易被绕过,不推荐 |
实战经验:MyBatis的#{}和${}要严格区分,我曾遇到开发混用导致注入的案例。参数化查询才是终极解决方案。
3. XSS跨站脚本攻防体系
3.1 三种XSS类型对比
- 反射型:恶意脚本随URL参数即时执行
http://example.com/search?q=<script>alert(1)</script> - 存储型:恶意脚本存入数据库长期生效
<textarea><img src=x onerror=stealCookie()></textarea> - DOM型:前端JS动态解析导致执行
document.write(location.hash.slice(1))
3.2 企业级防护方案
- CSP策略配置示例:
Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline' cdn.example.com - SpringBoot防XSS实践:
@Bean public FilterRegistrationBean<XssFilter> xssFilter() { FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new XssFilter()); registration.addUrlPatterns("/*"); return registration; } - 前端转义库选型:
- DOMPurify
- js-xss
- OWASP ESAPI
4. CSRF跨站请求伪造防护
4.1 攻击场景还原
攻击者构造恶意页面:
<img src="http://bank.com/transfer?to=hacker&amount=1000000" width="0" height="0">当已登录用户访问该页面时,资金自动转出。
4.2 防护方案实现
- Spring Security配置:
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } - 双重Cookie验证:
// 前端 fetch('/api/transfer', { headers: { 'X-CSRF-TOKEN': getCookie('csrf_token') } }) - 关键操作二次验证:
- 短信验证码
- 密码确认
- 生物识别
5. SSRF服务端请求伪造
5.1 漏洞利用链
- 探测内网服务:
http://vuln.com/api?url=http://127.0.0.1:8080/admin - 云元数据泄露:
http://vuln.com/api?url=http://169.254.169.254/latest/meta-data/ - 文件协议读取:
http://vuln.com/api?url=file:///etc/passwd
5.2 防护方案进阶
- 请求目标过滤:
ALLOWED_DOMAINS = ['api.example.com'] if parsed_url.netloc not in ALLOWED_DOMAINS: raise ValueError('Invalid URL domain') - DNS重绑定防护:
- 解析域名后立即使用IP
- 禁止DNS缓存
- 网络层隔离:
- 内网服务设置ACL
- 关键服务启用双向认证
6. XXE外部实体注入
6.1 漏洞利用方式
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <user>&xxe;</user>6.2 Java防护方案
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);7. 面试实战技巧
7.1 漏洞排查checklist
- SQL注入:
- 所有数据库交互是否使用预编译
- 动态SQL是否做字段白名单校验
- XSS:
- CSP策略是否配置
- 富文本是否经过严格过滤
- CSRF:
- 关键操作是否有Token保护
- GET请求是否用于数据修改
7.2 高频面试题解析
Q:如何设计安全的用户认证系统? A:需要分层防御:
- 传输层:强制HTTPS+HSTS
- 存储层:bcrypt加密+盐值
- 会话层:JWT短期有效+Refresh Token
- 操作层:关键操作二次验证
Q:发现SSRF漏洞如何深入利用? A:典型利用链:
- 扫描内网存活主机
- 访问云元数据接口
- 攻击Redis等内存数据库
- 通过gopher协议执行RCE
8. 靶场环境搭建建议
8.1 本地实验环境
- DVWA(Damn Vulnerable Web App)
- WebGoat
- OWASP Juice Shop
8.2 在线练习平台
- PortSwigger Web Security Academy
- Hack The Box
- CTFshow Web关卡
我曾用DVWA给团队做培训时发现,90%的开发在不知道答案的情况下,无法通过黑盒测试发现存储型XSS漏洞。这提醒我们:安全不能靠猜测,必须系统化学习。
