DVWA下的XSS通关(DOM型)
字数 1161 2025-08-15 21:32:24
DVWA下的DOM型XSS通关详解
1. XSS基础概念
XSS (Cross Site Scripting) 跨站脚本攻击:
- 一种注入攻击,攻击者在页面中注入恶意脚本代码
- 受害者访问该页面时,恶意代码会在其浏览器上执行
- 不仅限于JavaScript,还包括flash等脚本语言
XSS分类:
- 存储型XSS:恶意代码存储在服务器中
- 反射型XSS:恶意代码不存储在服务器中
- DOM型XSS:基于DOM树的特殊类型,可能是存储型或反射型
XSS常见用途:
- 盗取用户cookies
- 劫持会话
- 流量劫持
- 网页挂马
- DDOS攻击
- 权限提升
2. DOM型XSS详解
DOM (Document Object Model):
- 平台和语言中立的接口
- 使程序和脚本能动态访问和更新文档内容、结构及样式
- DOM型XSS是基于DOM文档对象模型的漏洞
工作原理:
- 浏览器为页面创建顶级Document对象
- 生成各个子文档对象,每个页面元素对应一个文档对象
- 可通过JS脚本对文档对象进行编辑从而修改页面元素
- 客户端脚本通过DOM动态修改页面内容,获取DOM数据并在本地执行
3. DVWA中的DOM型XSS通关
3.1 Low级别
服务器端代码:
<?php # No protections, anything goes ?>
攻击方法:
- 直接在URL输入:
default=<script>alert(/xss/)</script> - 无任何防护措施,直接注入即可
3.2 Medium级别
服务器端代码:
<?php
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
// 过滤<script>标签
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
防护措施:
- 检查输入中是否包含
<script>标签 - 如果发现则重定向到默认页面
绕过方法:
- 使用非
<script>标签的XSS向量 - 示例:闭合现有标签并构造XSS事件
></option></select><iframe onload=alert(/xss/)>
3.3 High级别
服务器端代码:
<?php
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
// 白名单过滤
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
// 允许的值
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
防护措施:
- 采用白名单机制,只允许French、English、German、Spanish四个值
- 其他输入都会被重定向到默认页面
绕过方法:
- 利用URL片段标识符(#)绕过白名单检查
- 示例:
default=English#</option></select><iframe onload=alert(/xss/)></option>
3.4 Impossible级别
服务器端代码:
<?php # Don't need to do anything, protction handled on the client side ?>
防护措施:
- 注释表明防护在客户端实现
- 实际无服务器端防护(根据提供的代码)
4. 防御建议
-
输入验证:
- 实施严格的白名单验证
- 对特殊字符进行转义
-
输出编码:
- 对所有动态输出进行HTML编码
- 使用安全的API如textContent代替innerHTML
-
内容安全策略(CSP):
- 实施严格的CSP策略
- 限制内联脚本执行
-
其他措施:
- 设置HttpOnly标志保护cookie
- 使用X-XSS-Protection头
- 考虑使用现代框架如React/Vue的自动转义功能
5. 总结
DOM型XSS攻击特点:
- 不依赖服务器端处理
- 完全在客户端执行
- 需要仔细分析DOM操作和数据流
防御关键:
- 不要信任客户端输入
- 安全地处理DOM操作
- 结合多种防御措施形成纵深防御