DVWA靶场通关笔记-XSS DOM(Low级别)
目录
一、XSS
二、DOM型XSS
三、代码分析
1、index.php
2、low.php
四、渗透实战
1、渗透准备
2、XSS注入
3、分析闭合
DVWA(Damn Vulnerable Web Application)中的 XSS DOM关卡是用于练习和演示 DOM XSS的不同场景,不同安全等级存在不同的脆弱点和绕过方法,本小节对低等级别的关卡进行渗透实战。
一、XSS
XSS(Cross-Site Scripting) 指的是攻击者通过在网页中注入恶意脚本,当用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话信息或进行其他恶意操作。核心原理就是未对用户输入或输出进行适当过滤,导致恶意代码被浏览器解析执行。
XSS类型 | 位置 | 数据流向 |
反射型 XSS | 服务器端 | 用户输入 → 服务器 → 响应中包含恶意代码 |
存储型 XSS | 服务器端 | 用户输入 → 存储(数据库) → 所有用户访问时触发 |
DOM 型 XSS | 客户端 JavaScript 代码 | 用户输入 → 浏览器 DOM 操作 → 执行恶意代码 |
二、DOM型XSS
DOM 型 XSS(Document Object Model Cross-Site Scripting) 是一种特殊的 XSS 攻击,其注入点存在于客户端 JavaScript 代码中,而非服务器端。攻击者通过操控网页的 DOM 环境(如 URL 参数、表单输入等),诱导浏览器执行恶意脚本,无需服务器参与。
三、代码分析
1、index.php
进入DVWA靶场源目录,找到index.php源码。
这段代码是DVWA(Damn Vulnerable Web Application)中DOM型XSS的演示页面,主要功能是:
- 根据用户选择的语言生成一个下拉菜单。
- 当用户提交选择后,URL中会包含default=参数。
- 页面JavaScript会读取URL参数并动态生成选项。
详细注释后的代码如下所示。
<?php
// 设置根目录路径
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
// 引入DVWA页面初始化文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 启动页面,要求认证和PHPIDS保护
dvwaPageStartup( array( 'authenticated', 'phpids' ) );// 创建新页面
$page = dvwaPageNewGrab();
// 设置页面标题
$page[ 'title' ] = 'Vulnerability: DOM Based Cross Site Scripting (XSS)' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'xss_d';
$page[ 'help_button' ] = 'xss_d';
$page[ 'source_button' ] = 'xss_d';// 连接数据库
dvwaDatabaseConnect();// 根据安全等级选择对应的级别文件
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {case 'low':$vulnerabilityFile = 'low.php';break;case 'medium':$vulnerabilityFile = 'medium.php';break;case 'high':$vulnerabilityFile = 'high.php';break;default:$vulnerabilityFile = 'impossible.php';break;
}// 引入指定级别的文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/xss_d/source/{$vulnerabilityFile}";// 对于impossible级别,不进行URI解码
$decodeURI = "decodeURI";
if ($vulnerabilityFile == 'impossible.php') {$decodeURI = "";
}// 构建页面主体
$page[ 'body' ] = <<<EOF
<div class="body_padded"><h1>Vulnerability: DOM Based Cross Site Scripting (XSS)</h1><div class="vulnerable_code_area"><p>Please choose a language:</p><form name="XSS" method="GET"><select name="default"><script>// 检查URL中是否包含default参数if (document.location.href.indexOf("default=") >= 0) {// 提取default参数值var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);// 动态写入选项document.write("<option value='" + lang + "'>" + $decodeURI(lang) + "</option>");document.write("<option value='' disabled='disabled'>----</option>");}// 写入固定选项document.write("<option value='English'>English</option>");document.write("<option value='French'>French</option>");document.write("<option value='Spanish'>Spanish</option>");document.write("<option value='German'>German</option>");</script></select><input type="submit" value="Select" /></form></div>
EOF;// 添加更多信息链接
$page[ 'body' ] .= "<h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_DOM-based_Cross_site_scripting_(OTG-CLIENT-001)' ) . "</li><li>" . dvwaExternalLinkUrlGet( 'https://www.acunetix.com/blog/articles/dom-xss-explained/' ) . "</li></ul>
</div>\n";// 输出页面
dvwaHtmlEcho( $page );?>
2、low.php
打开源码low.php,分析可知这段代码没有做完全未防护,可直接注入脚本,如下所示。
很明显代码存在DOM型XSS诸如的可能性,具体原因如下所示。
-
未验证或过滤输入:直接从URL获取
default
参数值,未进行任何过滤或编码。 -
直接拼接HTML:使用
document.write()
直接将用户输入拼接到HTML中。 -
DOM操作不安全:动态生成的DOM元素未进行适当的转义处理。
3、渗透思路
本关卡的XSS注入点关键代码如下所示,主要功能时检查当前 URL 是否包含 "default=" 参数,若存在则从中提取该参数值作为语言代码,通过document.write()
动态生成一个 HTML 的 option 元素,将提取的值作为 option 的 value 和显示文本,用于页面语言选择功能。但存在 DOM 型 XSS 风险。
// 检查当前URL是否包含"default="参数(用于语言设置或页面配置)
if (document.location.href.indexOf("default=") >= 0) {// 从URL中提取"default="后面的字符串作为语言值// 例如:http://example.com?default=en 会提取出"en"var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8 // +8是为了跳过"default="这8个字符);// 直接向页面写入HTML内容,创建一个选中状态的option元素// 这里的$decodeURI可能是自定义函数,用于解码URI编码的字符串document.write("<option value='" + lang + "'>" + $decodeURI(lang) + "</option>");// ... 后续代码可能会继续生成其他option选项
}
假设此时传入注入内容如下所示。
default='><script>alert('MOOYUAN')</script>
我们将参数传入后,构成如下闭合。
<option value=''><script>alert('MOOYUAN')</script>'>...</option>
假设此时传入注入内容如下所示。
default=<script>alert('MOOYUAN')</script>
当传入参数 default=<script>alert('MOOYUAN')</script>
时,,构成如下闭合,HTML 页面会立即弹出一个包含文本 MOOYUAN 的警告框(alert 对话框)。这是典型的 DOM 型 XSS 攻击 成功执行的表现。。
<option value='<script>alert('MOOYUAN')</script>'>...</option>
四、渗透实战
1、渗透准备
进入DVWA靶场XSS DOM关卡low级别,选择English,此时完整URL地址如下所示。
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English
2、XSS注入
尝试注入XSS语句<script>alert('mooyuan')</script>看效果如何,URL如下所示。
http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert('mooyuan')</script>
如下所示渗透成功,成功弹出mooyuan弹框。
3、分析闭合
右键元素,在查看器中搜索mooyuan关键字,如下所示。