一、跨站脚本攻击(XSS)
攻击原理
XSS通过诱导用户访问恶意构造的URL或提交含恶意脚本的表单,使浏览器执行攻击者注入的JavaScript代码。其核心在于浏览器无法区分脚本来源,导致用户会话信息(如Cookie、Token)被窃取或页面内容被篡改。
攻击类型与案例
-
存储型XSS
恶意脚本持久化存储在目标系统(如数据库、评论区),所有访问该页面的用户均会触发攻击。例如:某论坛允许用户提交HTML内容,攻击者注入<script>alert(document.cookie)</script>,其他用户浏览帖子时弹出其Cookie信息。 -
反射型XSS
脚本通过URL参数或表单提交即时反射到响应页面。例如:搜索功能未过滤用户输入,攻击者构造https://example.com/search?q=<script>stealData()</script>,用户点击链接后脚本立即执行。 -
DOM型XSS
通过修改页面DOM结构触发攻击,无需服务器响应。例如:前端代码直接使用innerHTML渲染用户输入,攻击者注入<img src=x onerror=hack()>实现任意代码执行。
防御策略
- 输入验证:对用户输入进行白名单过滤,禁止
<script>、onerror等危险字符。 - 输出编码:根据上下文使用HTML实体编码、URL编码或JavaScript编码。
- CSP策略:通过HTTP头
Content-Security-Policy限制脚本加载源,禁用内联脚本。
二、SQL注入(SQLi)
攻击原理
攻击者通过构造恶意SQL语句,绕过应用层验证直接操作数据库。常见于登录表单、搜索框等交互接口,利用未转义的用户输入拼接SQL查询。
技术细节与危害
-
联合查询注入
通过UNION合并恶意查询,窃取其他表数据。例如:' UNION SELECT username, password FROM users--
攻击者可获取全部用户凭证。
-
布尔盲注
通过布尔条件推断数据库信息。例如:' AND 1=(SELECT COUNT(*) FROM users WHERE username='admin' AND SUBSTRING(password,1,1)='a')--
逐字符猜测管理员密码。
-
时间盲注
利用SLEEP()函数延迟响应判断条件真假,适用于无直接反馈的场景。
防御方案
- 参数化查询:使用预编译语句(如JDBC的
PreparedStatement)分离代码与数据。 - 最小权限原则:数据库账户仅授予必要权限,禁止
DROP、TRUNCATE等高危操作。 - WAF防护:部署Web应用防火墙拦截
SELECT、UNION等敏感关键词。
三、远程代码执行(RCE)
攻击原理
攻击者通过输入恶意代码,使服务器执行任意系统命令或脚本。常见于文件上传、模板注入、反序列化等场景。
典型攻击路径
-
文件上传漏洞
上传恶意PHP文件至Web目录,通过URL访问触发执行。例如:上传<?php system($_GET['cmd']); ?>,访问https://example.com/upload/evil.php?cmd=id执行系统命令。 -
模板注入
某些模板引擎(如Freemarker、Thymeleaf)未过滤用户输入,导致代码执行。例如:// 危险代码示例Map<String, Object> data = new HashMap<>();data.put("userInput", request.getParameter("input"));Template template = cfg.getTemplate("vulnerable.ftl");template.process(data, writer); // 用户输入直接渲染
攻击者输入
${7*7}可计算结果,进一步构造${"freemarker.template.utility.Execute"?new()("id")}执行命令。 -
反序列化漏洞
解析恶意序列化数据时触发代码执行。例如:某Java应用使用ObjectInputStream反序列化用户输入,攻击者可构造包含Runtime.exec()的序列化流。
防御措施
- 输入过滤:禁止上传可执行文件,限制文件类型为
jpg/png等。 - 沙箱隔离:使用Docker容器或安全沙箱运行不可信代码。
- 禁用危险函数:PHP中关闭
eval()、system()等函数,Java中避免使用Runtime.exec()。
四、其他高危注入攻击
1. 命令注入(Command Injection)
攻击者通过拼接系统命令扩展应用功能。例如:
# 危险代码示例import osip = request.GET.get('ip')os.system('ping ' + ip) # 输入`8.8.8.8; rm -rf /`可执行恶意命令
防御:使用subprocess.run()并限制参数为列表形式,禁止直接拼接字符串。
2. LDAP注入
针对LDAP协议的注入攻击,可枚举或修改目录服务数据。例如:
username=*&password=* // 绕过认证查询所有用户
防御:对输入进行严格过滤,使用参数化查询。
3. XML外部实体注入(XXE)
解析恶意XML时加载外部实体,导致信息泄露或服务器请求伪造(SSRF)。例如:
<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><root>&xxe;</root>
防御:禁用DTD和外部实体解析,使用libxml_disable_entity_loader(true)。
五、综合防御体系构建
-
安全开发流程
- 代码审计:使用静态分析工具(如SonarQube)检测注入漏洞。
- 依赖管理:定期更新组件库,修复已知CVE漏洞。
-
运行时防护
- RASP(运行时应用自我保护):动态监测异常SQL、命令执行行为。
- 日志监控:记录所有用户输入及系统响应,便于溯源分析。
-
安全培训
- 定期组织安全编码培训,强化开发者安全意识。
- 模拟攻击演练(如CTF比赛),提升团队应急响应能力。
结语
注入攻击的本质是信任用户输入与缺乏上下文感知。通过实施输入验证、最小权限、深度防御等策略,可显著降低风险。开发者需持续关注OWASP Top 10等安全标准,将安全思维融入开发全生命周期,构建真正健壮的应用系统。