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模块。
image

2. 观察模块正常功能

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

3. 使用Burp Suite进行抓包分析

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

三 手工黑盒测试

1. 使用Repeater模块

右键将正常请求发送到 Burp Suite Repeater。
image

2. 测试Low难度Payload

输入<script>alert("x")</script>没有出现弹窗,直接返回alert("x"),说明<script>标签被删除。
image

3. 尝试绕过过滤机制

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

四 代码审计

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 实体编码
根本修复方式 对输出内容进行上下文相关编码 对输出内容进行上下文相关编码,避免依赖简单黑名单过滤
posted @ 2026-07-27 16:17  网安新手  阅读(17)  评论(0)    收藏  举报