十大高危注入攻击全解析:从原理到防御的完整指南

一、跨站脚本攻击(XSS)

攻击原理
XSS通过诱导用户访问恶意构造的URL或提交含恶意脚本的表单,使浏览器执行攻击者注入的JavaScript代码。其核心在于浏览器无法区分脚本来源,导致用户会话信息(如Cookie、Token)被窃取或页面内容被篡改。

攻击类型与案例

  1. 存储型XSS
    恶意脚本持久化存储在目标系统(如数据库、评论区),所有访问该页面的用户均会触发攻击。例如:某论坛允许用户提交HTML内容,攻击者注入<script>alert(document.cookie)</script>,其他用户浏览帖子时弹出其Cookie信息。

  2. 反射型XSS
    脚本通过URL参数或表单提交即时反射到响应页面。例如:搜索功能未过滤用户输入,攻击者构造https://example.com/search?q=<script>stealData()</script>,用户点击链接后脚本立即执行。

  3. DOM型XSS
    通过修改页面DOM结构触发攻击,无需服务器响应。例如:前端代码直接使用innerHTML渲染用户输入,攻击者注入<img src=x onerror=hack()>实现任意代码执行。

防御策略

  • 输入验证:对用户输入进行白名单过滤,禁止<script>onerror等危险字符。
  • 输出编码:根据上下文使用HTML实体编码、URL编码或JavaScript编码。
  • CSP策略:通过HTTP头Content-Security-Policy限制脚本加载源,禁用内联脚本。

二、SQL注入(SQLi)

攻击原理
攻击者通过构造恶意SQL语句,绕过应用层验证直接操作数据库。常见于登录表单、搜索框等交互接口,利用未转义的用户输入拼接SQL查询。

技术细节与危害

  1. 联合查询注入
    通过UNION合并恶意查询,窃取其他表数据。例如:

    1. ' UNION SELECT username, password FROM users--

    攻击者可获取全部用户凭证。

  2. 布尔盲注
    通过布尔条件推断数据库信息。例如:

    1. ' AND 1=(SELECT COUNT(*) FROM users WHERE username='admin' AND SUBSTRING(password,1,1)='a')--

    逐字符猜测管理员密码。

  3. 时间盲注
    利用SLEEP()函数延迟响应判断条件真假,适用于无直接反馈的场景。

防御方案

  • 参数化查询:使用预编译语句(如JDBC的PreparedStatement)分离代码与数据。
  • 最小权限原则:数据库账户仅授予必要权限,禁止DROPTRUNCATE等高危操作。
  • WAF防护:部署Web应用防火墙拦截SELECTUNION等敏感关键词。

三、远程代码执行(RCE)

攻击原理
攻击者通过输入恶意代码,使服务器执行任意系统命令或脚本。常见于文件上传、模板注入、反序列化等场景。

典型攻击路径

  1. 文件上传漏洞
    上传恶意PHP文件至Web目录,通过URL访问触发执行。例如:上传<?php system($_GET['cmd']); ?>,访问https://example.com/upload/evil.php?cmd=id执行系统命令。

  2. 模板注入
    某些模板引擎(如Freemarker、Thymeleaf)未过滤用户输入,导致代码执行。例如:

    1. // 危险代码示例
    2. Map<String, Object> data = new HashMap<>();
    3. data.put("userInput", request.getParameter("input"));
    4. Template template = cfg.getTemplate("vulnerable.ftl");
    5. template.process(data, writer); // 用户输入直接渲染

    攻击者输入${7*7}可计算结果,进一步构造${"freemarker.template.utility.Execute"?new()("id")}执行命令。

  3. 反序列化漏洞
    解析恶意序列化数据时触发代码执行。例如:某Java应用使用ObjectInputStream反序列化用户输入,攻击者可构造包含Runtime.exec()的序列化流。

防御措施

  • 输入过滤:禁止上传可执行文件,限制文件类型为jpg/png等。
  • 沙箱隔离:使用Docker容器或安全沙箱运行不可信代码。
  • 禁用危险函数:PHP中关闭eval()system()等函数,Java中避免使用Runtime.exec()

四、其他高危注入攻击

1. 命令注入(Command Injection)

攻击者通过拼接系统命令扩展应用功能。例如:

  1. # 危险代码示例
  2. import os
  3. ip = request.GET.get('ip')
  4. os.system('ping ' + ip) # 输入`8.8.8.8; rm -rf /`可执行恶意命令

防御:使用subprocess.run()并限制参数为列表形式,禁止直接拼接字符串。

2. LDAP注入

针对LDAP协议的注入攻击,可枚举或修改目录服务数据。例如:

  1. username=*&password=* // 绕过认证查询所有用户

防御:对输入进行严格过滤,使用参数化查询。

3. XML外部实体注入(XXE)

解析恶意XML时加载外部实体,导致信息泄露或服务器请求伪造(SSRF)。例如:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
  3. <root>&xxe;</root>

防御:禁用DTD和外部实体解析,使用libxml_disable_entity_loader(true)

五、综合防御体系构建

  1. 安全开发流程

    • 代码审计:使用静态分析工具(如SonarQube)检测注入漏洞。
    • 依赖管理:定期更新组件库,修复已知CVE漏洞。
  2. 运行时防护

    • RASP(运行时应用自我保护):动态监测异常SQL、命令执行行为。
    • 日志监控:记录所有用户输入及系统响应,便于溯源分析。
  3. 安全培训

    • 定期组织安全编码培训,强化开发者安全意识。
    • 模拟攻击演练(如CTF比赛),提升团队应急响应能力。

结语

注入攻击的本质是信任用户输入缺乏上下文感知。通过实施输入验证、最小权限、深度防御等策略,可显著降低风险。开发者需持续关注OWASP Top 10等安全标准,将安全思维融入开发全生命周期,构建真正健壮的应用系统。