DVWA靶场XSS(Stored)学习分享
字数 1481 2025-08-24 20:49:31

DVWA靶场存储型XSS(XSS Stored)漏洞学习指南

1. 存储型XSS概述

存储型XSS(Stored Cross-Site Scripting)是一种将恶意脚本永久存储在目标服务器上的XSS攻击类型。与反射型XSS不同,存储型XSS的恶意代码会被保存在数据库中,当其他用户访问受影响页面时,恶意代码会被执行。

2. DVWA靶场存储型XSS漏洞分析

2.1 Low级别漏洞

代码分析

  • 使用trim()函数移除字符串两侧的空白字符
  • 使用mysql_real_escape_string()函数转义特殊字符
  • 使用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>字符串

漏洞原因

  • 仅过滤了<script>标签,但过滤不彻底
  • 允许其他HTML标签和事件处理器

绕过方法

  1. 双写绕过

    • 修改name参数为:<sc<script>ript>alert(/xss/)</script>
  2. 大小写混淆

    • 修改name参数为:<Script>alert(/xss/)</script>
  3. 非script标签payload

    • ``
    • 审查元素修改长度限制后提交

2.3 High级别漏洞

代码分析

  • 使用正则表达式过滤<script>标签
  • 忽略了img、iframe等其他危险标签

漏洞原因

  • 过滤不全面,只针对特定标签
  • 没有对事件处理器进行过滤

利用方法

  • 修改name参数为:``
  • 或审查元素修改长度限制后提交

2.4 Impossible级别防护

防护措施

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

3. 防护建议

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 使用白名单机制,只允许安全的字符和格式
  2. 输出编码

    • 对所有动态输出到页面的内容进行HTML编码
    • 使用htmlspecialchars等函数
  3. 内容安全策略(CSP)

    • 实施严格的内容安全策略
    • 限制脚本来源和内联脚本执行
  4. 框架防护

    • 使用现代框架(如React、Vue等)内置的XSS防护机制
    • 避免直接使用innerHTML等危险API
  5. HTTP头设置

    • 设置X-XSS-Protection
    • 设置Content-Type头并禁用MIME嗅探

4. 总结

存储型XSS因其持久性和广泛影响而特别危险。通过DVWA靶场的四个级别,我们学习了:

  • 完全不防护的Low级别漏洞
  • 简单过滤可被绕过的Medium级别
  • 过滤不全面的High级别
  • 使用正确编码的Impossible级别防护

在实际开发中,应当采用Impossible级别的防护思路,结合多种安全措施,才能有效防范存储型XSS攻击。

DVWA靶场存储型XSS(XSS Stored)漏洞学习指南 1. 存储型XSS概述 存储型XSS(Stored Cross-Site Scripting)是一种将恶意脚本永久存储在目标服务器上的XSS攻击类型。与反射型XSS不同,存储型XSS的恶意代码会被保存在数据库中,当其他用户访问受影响页面时,恶意代码会被执行。 2. DVWA靶场存储型XSS漏洞分析 2.1 Low级别漏洞 代码分析 : 使用 trim() 函数移除字符串两侧的空白字符 使用 mysql_real_escape_string() 函数转义特殊字符 使用 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> 字符串 漏洞原因 : 仅过滤了 <script> 标签,但过滤不彻底 允许其他HTML标签和事件处理器 绕过方法 : 双写绕过 : 修改name参数为: <sc<script>ript>alert(/xss/)</script> 大小写混淆 : 修改name参数为: <Script>alert(/xss/)</script> 非script标签payload : `` 审查元素修改长度限制后提交 2.3 High级别漏洞 代码分析 : 使用正则表达式过滤 <script> 标签 忽略了img、iframe等其他危险标签 漏洞原因 : 过滤不全面,只针对特定标签 没有对事件处理器进行过滤 利用方法 : 修改name参数为: `` 或审查元素修改长度限制后提交 2.4 Impossible级别防护 防护措施 : 使用 htmlspecialchars 函数对所有输出进行编码 注意:如果 htmlspecialchars 使用不当,仍可能被绕过(特别是DOM型XSS) 3. 防护建议 输入验证 : 对所有用户输入进行严格验证 使用白名单机制,只允许安全的字符和格式 输出编码 : 对所有动态输出到页面的内容进行HTML编码 使用 htmlspecialchars 等函数 内容安全策略(CSP) : 实施严格的内容安全策略 限制脚本来源和内联脚本执行 框架防护 : 使用现代框架(如React、Vue等)内置的XSS防护机制 避免直接使用 innerHTML 等危险API HTTP头设置 : 设置 X-XSS-Protection 头 设置 Content-Type 头并禁用MIME嗅探 4. 总结 存储型XSS因其持久性和广泛影响而特别危险。通过DVWA靶场的四个级别,我们学习了: 完全不防护的Low级别漏洞 简单过滤可被绕过的Medium级别 过滤不全面的High级别 使用正确编码的Impossible级别防护 在实际开发中,应当采用Impossible级别的防护思路,结合多种安全措施,才能有效防范存储型XSS攻击。