DVWA下的XSS通关(存储型)
字数 1412 2025-08-15 21:32:24

DVWA存储型XSS漏洞通关手册

1. XSS基础概念

XSS (Cross Site Scripting) 跨站脚本攻击是一种注入攻击,攻击者在页面中注入恶意脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行。

XSS分类:

  • 存储型XSS:恶意代码存储在服务器中(如留言、个人信息等)
  • 反射型XSS:恶意代码不存储在服务器中,通过URL等方式即时反射
  • DOM型XSS:基于DOM树的XSS,可能是存储型或反射型

XSS常见用途:

  • 盗取用户cookies
  • 劫持会话
  • 流量劫持
  • 网页挂马
  • DDOS攻击
  • 权限提升

2. DVWA存储型XSS漏洞分析

2.1 Low级别漏洞

源代码分析:

$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
$message = stripslashes($message);
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);

防护措施:

  • 仅使用trim()去除空白字符
  • 使用stripslashes()删除反斜杠
  • 使用mysqli_real_escape_string()防止SQL注入
  • 无任何XSS过滤措施

攻击方法:

  1. 直接在Message或Name字段输入:<script>alert(/xss/)</script>
  2. 如果Name字段有长度限制:
    • 方法1:F12修改maxlength属性值
    • 方法2:使用BurpSuite拦截修改请求

2.2 Medium级别漏洞

源代码分析:

$message = strip_tags(addslashes($message));
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$message = htmlspecialchars($message);

$name = str_replace('<script>', '', $name);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);

防护措施:

  • 对Message字段:
    • strip_tags()去除HTML标签(保留<b>
    • addslashes()转义特殊字符
    • htmlspecialchars()编码特殊字符
  • 对Name字段:
    • 简单过滤<script>字符串

绕过方法:

  1. 双写绕过<sc<script>ript>alert(/xss/)</script>
  2. 大小写混淆<ScRipt>alert(/xss/);</ScRipt>
  3. 使用非script标签
    • ``
    • <iframe src="javascript:alert('xss');">
    • 其他HTML标签利用

2.3 High级别漏洞

源代码分析:

$name = preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);

防护措施:

  • 使用正则表达式过滤<script>标签的各种变形
  • 但仍未过滤其他危险标签如``, <iframe>

绕过方法:

  1. 使用标签:
  2. 使用<iframe>标签:<iframe src="javascript:alert('xss');">
  3. 使用DATA URL:
    <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
    
    (其中base64解码为<script>alert('xss')</script>

2.4 Impossible级别防护

源代码分析:

$message = stripslashes($message);
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$message = htmlspecialchars($message);

$name = stripslashes($name);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);
$name = htmlspecialchars($name);

// 使用预处理语句防止SQL注入
$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);
$data->execute();

防护措施:

  1. 对所有输出使用htmlspecialchars()编码
  2. 使用预处理语句防止SQL注入
  3. 添加CSRF防护令牌
  4. 彻底防御了存储型XSS

3. 防护建议

  1. 输入过滤

    • 对用户输入进行严格过滤
    • 使用白名单而非黑名单策略
  2. 输出编码

    • 对所有动态内容使用htmlspecialchars()编码
    • 根据输出上下文使用适当的编码函数
  3. 安全开发实践

    • 使用预处理语句防止SQL注入
    • 实施CSRF防护
    • 设置HTTP安全头(如Content-Security-Policy)
  4. 内容安全策略(CSP)

    • 通过CSP限制脚本执行来源
    • 禁止内联脚本执行
  5. 框架安全功能

    • 使用现代框架(如React、Angular等)的内置XSS防护
    • 避免直接操作DOM

通过实施这些措施,可以有效地防御存储型XSS攻击,保护Web应用安全。

DVWA存储型XSS漏洞通关手册 1. XSS基础概念 XSS (Cross Site Scripting) 跨站脚本攻击是一种注入攻击,攻击者在页面中注入恶意脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行。 XSS分类: 存储型XSS :恶意代码存储在服务器中(如留言、个人信息等) 反射型XSS :恶意代码不存储在服务器中,通过URL等方式即时反射 DOM型XSS :基于DOM树的XSS,可能是存储型或反射型 XSS常见用途: 盗取用户cookies 劫持会话 流量劫持 网页挂马 DDOS攻击 权限提升 2. DVWA存储型XSS漏洞分析 2.1 Low级别漏洞 源代码分析: 防护措施: 仅使用 trim() 去除空白字符 使用 stripslashes() 删除反斜杠 使用 mysqli_real_escape_string() 防止SQL注入 无任何XSS过滤措施 攻击方法: 直接在Message或Name字段输入: <script>alert(/xss/)</script> 如果Name字段有长度限制: 方法1:F12修改maxlength属性值 方法2:使用BurpSuite拦截修改请求 2.2 Medium级别漏洞 源代码分析: 防护措施: 对Message字段: strip_tags() 去除HTML标签(保留 <b> ) addslashes() 转义特殊字符 htmlspecialchars() 编码特殊字符 对Name字段: 简单过滤 <script> 字符串 绕过方法: 双写绕过 : <sc<script>ript>alert(/xss/)</script> 大小写混淆 : <ScRipt>alert(/xss/);</ScRipt> 使用非script标签 : `` <iframe src="javascript:alert('xss');"> 其他HTML标签利用 2.3 High级别漏洞 源代码分析: 防护措施: 使用正则表达式过滤 <script> 标签的各种变形 但仍未过滤其他危险标签如 ``, <iframe> 等 绕过方法: 使用 标签: 使用 <iframe> 标签: <iframe src="javascript:alert('xss');"> 使用DATA URL: (其中base64解码为 <script>alert('xss')</script> ) 2.4 Impossible级别防护 源代码分析: 防护措施: 对所有输出使用 htmlspecialchars() 编码 使用预处理语句防止SQL注入 添加CSRF防护令牌 彻底防御了存储型XSS 3. 防护建议 输入过滤 : 对用户输入进行严格过滤 使用白名单而非黑名单策略 输出编码 : 对所有动态内容使用 htmlspecialchars() 编码 根据输出上下文使用适当的编码函数 安全开发实践 : 使用预处理语句防止SQL注入 实施CSRF防护 设置HTTP安全头(如Content-Security-Policy) 内容安全策略(CSP) : 通过CSP限制脚本执行来源 禁止内联脚本执行 框架安全功能 : 使用现代框架(如React、Angular等)的内置XSS防护 避免直接操作DOM 通过实施这些措施,可以有效地防御存储型XSS攻击,保护Web应用安全。