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过滤措施
攻击方法:
- 直接在Message或Name字段输入:
<script>alert(/xss/)</script> - 如果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>字符串
- 简单过滤
绕过方法:
- 双写绕过:
<sc<script>ript>alert(/xss/)</script> - 大小写混淆:
<ScRipt>alert(/xss/);</ScRipt> - 使用非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>等
绕过方法:
- 使用
标签: - 使用
<iframe>标签:<iframe src="javascript:alert('xss');"> - 使用DATA URL:
(其中base64解码为<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object><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();
防护措施:
- 对所有输出使用
htmlspecialchars()编码 - 使用预处理语句防止SQL注入
- 添加CSRF防护令牌
- 彻底防御了存储型XSS
3. 防护建议
-
输入过滤:
- 对用户输入进行严格过滤
- 使用白名单而非黑名单策略
-
输出编码:
- 对所有动态内容使用
htmlspecialchars()编码 - 根据输出上下文使用适当的编码函数
- 对所有动态内容使用
-
安全开发实践:
- 使用预处理语句防止SQL注入
- 实施CSRF防护
- 设置HTTP安全头(如Content-Security-Policy)
-
内容安全策略(CSP):
- 通过CSP限制脚本执行来源
- 禁止内联脚本执行
-
框架安全功能:
- 使用现代框架(如React、Angular等)的内置XSS防护
- 避免直接操作DOM
通过实施这些措施,可以有效地防御存储型XSS攻击,保护Web应用安全。