DVWA-XSS(Stored)
字数 1506 2025-08-11 17:39:51

存储型XSS漏洞分析与利用教学文档

1. 存储型XSS概述

存储型XSS(Stored Cross-Site Scripting)是一种恶意脚本被永久存储在目标服务器上的XSS攻击类型。当用户访问包含恶意脚本的页面时,脚本会从服务器加载并在用户浏览器中执行。

2. 不同安全等级的存储型XSS分析

2.1 Low级别

漏洞分析:

  • 输入处理函数:
    • trim(): 仅移除字符串两侧空白字符
    • mysql_real_escape_string(): 仅转义SQL特殊字符
    • stripslashes(): 仅删除反斜杠
  • 未对XSS相关字符进行任何过滤

利用方法:

  1. 在message栏直接输入: <script>alert(/xss/)</script>
  2. 对于name栏(有前端长度限制):
    • 使用开发者工具修改长度限制
    • 或抓包修改name参数为: <script>alert(/name/)</script>

2.2 Medium级别

防护措施:

  • strip_tags(): 剥离HTML/XML/PHP标签(保留<b>标签)
  • addslashes(): 在特殊字符前添加反斜杠
  • 对message参数使用htmlspecialchars()编码
  • 对name参数简单过滤<script>字符串

绕过方法:

  1. 双写绕过:
    • Payload: <sc<script>ript>alert(/xss/)</script>
  2. 大小写混淆:
    • Payload: <Script>alert(/xss/)</script>
  3. 非script标签利用:
    • Payload: ``

2.3 High级别

防护措施:

  • 使用正则表达式过滤<script>标签

绕过方法:

  • 使用其他危险标签如img、iframe等:
    • Payload: ``

2.4 Impossible级别

防护措施:

  • 全面使用htmlspecialchars()函数对输出进行编码
  • 注意: 若使用不当仍可能被绕过,特别是DOM型XSS

3. 关键函数解析

  1. trim(string, charlist)

    • 功能: 移除字符串两侧空白字符或预定义字符
    • 预定义字符: \t, \n, \x0B, \r, 空格
    • 可选参数charlist可添加额外需删除字符
  2. mysql_real_escape_string(string, connection)

    • 功能: 转义字符串中的特殊符号
    • 转义字符: \x00, \n, \r, \, ', ", \x1a
  3. stripslashes(string)

    • 功能: 删除字符串中的反斜杠
  4. strip_tags()

    • 功能: 剥去字符串中的HTML、XML和PHP标签
    • 可保留特定标签(如<b>)
  5. addslashes()

    • 功能: 在预定义字符前添加反斜杠
    • 预定义字符: 单引号、双引号、反斜杠、NULL
  6. htmlspecialchars()

    • 功能: 将特殊字符转换为HTML实体
    • 关键防御函数,但需正确使用

4. 防御建议

  1. 对所有用户输入进行严格的验证和过滤
  2. 输出时使用htmlspecialchars()等函数进行编码
  3. 实施内容安全策略(CSP)
  4. 避免直接使用用户输入构建DOM
  5. 对不同的上下文(HTML、JavaScript、CSS、URL)采用不同的编码方式

5. 总结

存储型XSS的危害性较大,因为恶意代码会持久存储在服务器上,影响所有访问相关页面的用户。防御存储型XSS需要结合输入验证、输出编码和适当的上下文处理,不能仅依赖单一防护措施。

存储型XSS漏洞分析与利用教学文档 1. 存储型XSS概述 存储型XSS(Stored Cross-Site Scripting)是一种恶意脚本被永久存储在目标服务器上的XSS攻击类型。当用户访问包含恶意脚本的页面时,脚本会从服务器加载并在用户浏览器中执行。 2. 不同安全等级的存储型XSS分析 2.1 Low级别 漏洞分析 : 输入处理函数: trim() : 仅移除字符串两侧空白字符 mysql_real_escape_string() : 仅转义SQL特殊字符 stripslashes() : 仅删除反斜杠 未对XSS相关字符进行任何过滤 利用方法 : 在message栏直接输入: <script>alert(/xss/)</script> 对于name栏(有前端长度限制): 使用开发者工具修改长度限制 或抓包修改name参数为: <script>alert(/name/)</script> 2.2 Medium级别 防护措施 : strip_tags() : 剥离HTML/XML/PHP标签(保留 <b> 标签) addslashes() : 在特殊字符前添加反斜杠 对message参数使用 htmlspecialchars() 编码 对name参数简单过滤 <script> 字符串 绕过方法 : 双写绕过: Payload: <sc<script>ript>alert(/xss/)</script> 大小写混淆: Payload: <Script>alert(/xss/)</script> 非script标签利用: Payload: `` 2.3 High级别 防护措施 : 使用正则表达式过滤 <script> 标签 绕过方法 : 使用其他危险标签如img、iframe等: Payload: `` 2.4 Impossible级别 防护措施 : 全面使用 htmlspecialchars() 函数对输出进行编码 注意: 若使用不当仍可能被绕过,特别是DOM型XSS 3. 关键函数解析 trim(string, charlist) 功能: 移除字符串两侧空白字符或预定义字符 预定义字符: \t , \n , \x0B , \r , 空格 可选参数charlist可添加额外需删除字符 mysql_ real_ escape_ string(string, connection) 功能: 转义字符串中的特殊符号 转义字符: \x00 , \n , \r , \ , ' , " , \x1a stripslashes(string) 功能: 删除字符串中的反斜杠 strip_ tags() 功能: 剥去字符串中的HTML、XML和PHP标签 可保留特定标签(如 <b> ) addslashes() 功能: 在预定义字符前添加反斜杠 预定义字符: 单引号、双引号、反斜杠、NULL htmlspecialchars() 功能: 将特殊字符转换为HTML实体 关键防御函数,但需正确使用 4. 防御建议 对所有用户输入进行严格的验证和过滤 输出时使用 htmlspecialchars() 等函数进行编码 实施内容安全策略(CSP) 避免直接使用用户输入构建DOM 对不同的上下文(HTML、JavaScript、CSS、URL)采用不同的编码方式 5. 总结 存储型XSS的危害性较大,因为恶意代码会持久存储在服务器上,影响所有访问相关页面的用户。防御存储型XSS需要结合输入验证、输出编码和适当的上下文处理,不能仅依赖单一防护措施。