DVWA Medium Reflected XSS安全测试与防护分析
注意:有关Reflected XSS漏洞的基础知识与原理已在上篇文章指出,此处不再解释。
可参考该文章https://www.cnblogs.com/lky-sec/articles/21412117
本文仅用于网络安全学习与防御研究。所有测试均在本人本地部署、合法授权的 DVWA 靶场中进行,禁止将相关方法用于任何未授权系统。
中等难度Reflected XSS
一 测试范围与环境
本次测试目标为本地DVWA靶场中的Reflected XSS模块。
| 项目 | 配置 |
|---|---|
| 测试环境 | 本地 DVWA 靶场 |
| 安全等级 | Medium |
| 测试系统 | Kali Linux |
| 测试工具 | Firefox、Burp Suite |
| 测试方式 | 黑盒测试、源码审计 |
| 授权情况 | 本人本地靶场,合法授权 |
二 页面与请求分析
1. 设置难度等级
进入 DVWA Security,将安全等级设置为 Medium,随后进入Reflected XSS模块。

2. 观察模块正常功能
页面提供一个文本输入框,要求用户输入姓名,尝试输入1 返回Hello 1说明用户提交的内容会被服务器处理后重新输出到当前页面中。

3. 使用Burp Suite进行抓包分析
开启 Burp Suite Proxy 模块进行拦截。

通过抓包可以看到,该模块使用GET请求向:/vulnerabilities/xss_r/提交数据,请求参数主要为:name=1
其中name为用户可控参数,其值会被服务器接收并重新回显到页面中。
因此,后续手工黑盒测试主要针对name参数,通过修改其内容观察服务器的过滤方式以及页面是否会执行其中的 JavaScript 代码。
三 手工黑盒测试
1. 使用Repeater模块
右键将正常请求发送到 Burp Suite Repeater。

2. 测试Low难度Payload
输入<script>alert("x")</script>没有出现弹窗,直接返回alert("x"),说明<script>标签被删除。

3. 尝试绕过过滤机制
将<script>标签进行大小写混合,输入<ScRiPt>alert("x")</ScRiPt>发现弹窗成功,证明绕过过滤机制。

四 代码审计
1. 点击view source查看源码
<?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
echo "<pre>Hello ${name}</pre>";
}
?>
2. 源码分析
Medium 等级首先通过:
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
获取用户提交的name参数,并使用str_replace()删除其中完全匹配的小写<script>标签。
相比Low等级,Medium增加了对<script>标签的过滤,但该过滤采用固定字符串匹配,只能识别完全一致的<script>,无法处理大小写变化等其他形式。例如:<ScRiPt>alert("x")</ScRiPt>
不会匹配黑名单中的<script>,因此可以绕过过滤。
随后程序仍然直接将处理后的$name输出到 HTML 页面:echo "<pre>Hello ${name}</pre>";
没有进行 HTML 实体编码或安全输出处理,浏览器仍可能将其中的恶意 HTML 或 JavaScript 内容解析执行。
此外:
header ("X-XSS-Protection: 0");关闭了浏览器旧版 XSS 防护机制,无法为页面提供额外的防护。
因此,该漏洞的根本原因是:程序仅通过简单的字符串替换过滤特定<script>标签,同时将用户可控内容直接输出到页面,未进行可靠的输出编码。
3. 修复方案
1)对用户输入进行严格的格式和长度限制。
2)避免使用 str_replace() 等黑名单方式过滤特定HTML标签。
3)在输出用户输入时进行HTML实体编码。
4)根据数据所在的 HTML、属性或 JavaScript 上下文采用对应的输出编码方式。
5)禁止不可信输入直接作为HTML或JavaScript代码解析。
6)配置合理的Content Security Policy(CSP),限制脚本执行来源。
7)对异常XSS Payload 和高频请求进行日志记录与安全监控。
五 Low与Medium差异
| 对比项 | Low | Medium |
|---|---|---|
| 参数获取方式 | $_GET['name'] | $_GET['name'] |
| 输入过滤 | 无 | 使用str_replace()过滤 |
| 过滤内容 | 无 | <script> |
| 过滤方式 | 无 | 将完全匹配的<script> 替换为空 |
| 是否区分大小写 | 不涉及 | 是 |
| HTML输出编码 | 无 | 无 |
| 用户输入输出方式 | 直接输出到页面 | 过滤后仍直接输出到页面 |
<script>直接利用 |
可以 | 被过滤 |
| 大小写混合标签 | 可以 | 可绕过过滤 |
X-XSS-Protection |
设置为 0 | 设置为 0 |
| XSS漏洞 | 存在 | 仍然存在 |
| 主要防护措施 | 无明显防护 | 增加针对 <script>的字符串过滤 |
| 主要安全问题 | 用户输入未经处理直接回显 | 黑名单过滤不完整,且输出时未进行 HTML 实体编码 |
| 根本修复方式 | 对输出内容进行上下文相关编码 | 对输出内容进行上下文相关编码,避免依赖简单黑名单过滤 |

浙公网安备 33010602011771号