DVWA Medium DOM XSS安全测试与防护分析
注意有关DOM XSS漏洞的基础知识与原理已在上篇文章指出此处不再解释。可参考该文章https://www.cnblogs.com/lky-sec/articles/21412117本文仅用于网络安全学习与防御研究。所有测试均在本人本地部署、合法授权的 DVWA 靶场中进行禁止将相关方法用于任何未授权系统。一 测试范围与环境本次测试目标为本地DVWA靶场中的XSSDOM模块。项目配置测试环境本地 DVWA 靶场安全等级Medium测试系统Kali Linux测试工具Firefox、Burp Suite测试方式黑盒测试、源码审计授权情况本人本地靶场合法授权二 页面与请求分析1. 设置难度等级进入 DVWA Security将安全等级设置为 Medium随后进入 XSSDOM模块。2. 观察模块正常功能页面提供语言选择下拉框可以选择 English、French、Spanish、German 等语言。选择不同语言后可以观察到浏览器地址栏中的default参数发生变化。3. 分析URL参数与DOM变化也可使用浏览器开发者工具进行查看页面源码开启Burp Suite Proxy模块进行拦截提交一次正常请求。右键将正常请求发送到 Burp Suite Repeater。发送请求观察Response包页面源码。发现程序首先通过document.location.href获取当前页面URL并查找其中的default参数var lang document.location.href.substring( document.location.href.indexOf(default)8 );随后通过document.write(option value lang decodeURI(lang) /option);将default参数对应的内容动态写入页面DOM。因此该模块的数据流可以表示为URL中的default参数 ↓ document.location.href读取 ↓ substring()提取参数内容 ↓ document.write()写入页面DOM这说明default参数属于用户可控数据并会直接影响页面DOM结构三 手工黑盒测试1.测试Low难度Payload输入scriptalert(x)/script无弹窗且URL处返回English。将该命令大小写混合输入ScRiPtalert(x);/ScRiPt无弹窗且URL处返回English。结合两次输入即其对应返回结果猜测此处对script标签进行过滤且不区分大小写。2.使用不依赖script标签的HTML事件属性HTML 中部分元素支持事件属性例如onclick onload onerror这些属性会在对应事件发生时执行其中的 JavaScript因此 JavaScript 并不一定必须写在script标签内部。例如输入img srcx onerroralert(x)其中imgHTML 图片标签。 srcx指定一个通常无法正常加载的图片地址 x。 onerror图片加载失败时触发的错误事件。 alert(x)事件触发后执行的 JavaScript 代码。其执行过程为img标签被浏览器解析 ↓ 浏览器尝试加载srcx ↓ 图片加载失败 ↓ 触发onerror事件 ↓ 执行alert(x)提交后未出现弹窗。结合前端 JavaScript 可以发现default参数最终通过document.write()被写入option元素内部因此img标签仍处于select结构中无法作为正常图片元素触发 onerror 事件。因此需要先闭合原有的 option 和 select 标签使后续 HTML 内容脱离下拉框结构。3.脱离下拉框结构输入/option/selectimg srcx onerroralert(x)或者/selectimg srcx onerroralert(x)弹窗成功四 黑盒测试结果分析测试Payload测试结果结果分析scriptalert(x)/script未弹窗URL返回EnglishLow难度Payload失效说明Medium等级增加了针对script标签的限制ScRiPtalert(x);/ScRiPt未弹窗URL仍返回English改变大小写后仍被限制初步判断过滤规则对script标签匹配不区分大小写img srcx onerroralert(x)未弹窗Payload未使用script标签但由于内容仍位于select/option结构中img标签无法作为正常图片元素执行/option/selectimg srcx onerroralert(x)成功弹窗通过闭合原有DOM结构使img标签脱离下拉框并正常触发onerror事件/selectimg srcx onerroralert(x)成功弹窗浏览器能够自动结束当前option元素仅闭合select同样可以脱离原有DOM结构并执行事件代码五 代码审计1. 查看Medium源码点击view source查看源码?php // Is there any input? if ( array_key_exists( default, $_GET ) !is_null ($_GET[ default ]) ) { $default $_GET[default]; # Do not allow script tags if (stripos ($default, script) ! false) { header (location: ?defaultEnglish); exit; } } ?2. 源码分析Medium 等级首先获取用户通过 URL 提交的 default 参数$default $_GET[default];随后使用stripos($default, script)检测参数中是否包含 script 字符串。stripos() 进行的是不区分大小写的字符串查找因此script ScRiPt SCRIPT均能够被检测到。当发现参数中存在script时程序执行header (location: ?defaultEnglish); exit;将页面重新重定向至?defaultEnglish这与前面黑盒测试中普通script和大小写混合ScRiPt均被重定向至 English 的现象一致。但该防护仅针对script字符串进行检测并没有限制其他 HTML 标签或事件属性。因此不包含script的内容不会触发该过滤规则例如img srcx onerroralert(x)结合前面已经分析的前端 document.write()此类内容仍可能被写入页面 DOM 并被浏览器解析。因此该漏洞的主要原因是Medium 等级仅通过 stripos() 对 script 标签进行黑名单检测防护范围有限未从根本上阻止用户可控数据进入 DOM 结构。3. 修复方案1对 default 参数采用白名单校验仅允许 English、French、Spanish、German 等合法值。2避免使用 document.write() 将用户可控数据直接写入 DOM。3使用 textContent、createElement() 等安全 DOM API 生成页面内容。4对需要输出到页面的动态数据进行上下文相关编码。5避免使用 stripos() 等黑名单方式过滤特定标签或关键字。6配置合理的 Content Security PolicyCSP限制内联脚本和事件属性执行。7对异常 default 参数及可疑 XSS 请求进行日志记录与安全监控。六 Low与Medium差异对比项LowMedium服务端防护无增加服务端检测逻辑default参数处理不处理获取$_GET[default]并进行检查过滤方式无使用stripos()检测script是否区分大小写不涉及不区分大小写遇到script时的处理不拦截重定向到?defaultEnglish普通scriptalert(x)/script可利用被拦截大小写混合ScRiPt.../ScRiPt可利用仍被拦截非script型 Payload可利用仍可能利用HTML 事件属性利用可利用仍可能通过onerror等方式绕过DOM 写入根因用户输入可进入 DOM用户输入仍可进入 DOM主要防护措施无任何防护仅对script进行黑名单检测主要安全问题用户输入可直接影响 DOM 结构黑名单检测范围有限未从根本上阻止用户输入进入 DOM漏洞是否存在存在仍然存在根本修复方式避免将用户输入直接写入 DOM并采用白名单校验避免将用户输入直接写入 DOM并采用白名单校验

相关新闻

ARM Cortex-M3/M4内核深度解析:从架构原理到嵌入式开发实战

ARM Cortex-M3/M4内核深度解析:从架构原理到嵌入式开发实战

1. 从零开始:为什么ARM Cortex-M内核是嵌入式开发的基石? 如果你刚接触嵌入式开发,或者从传统的51、AVR单片机转向更复杂的应用,那么“ARM Cortex-M”这个名字一定会高频出现。它不是一个具体的芯片型号,而是一个处理器…

2026/10/8 2:22:08 阅读更多 →
单机游戏MOD加载机制解析与高效管理工具推荐:汽游MOD平台深度测评

单机游戏MOD加载机制解析与高效管理工具推荐:汽游MOD平台深度测评

1. 引言与背景 在现代游戏开发与玩家社区生态中,MOD(Modification,游戏模组)扮演着至关重要的角色。从早期的《半条命》衍生出《反恐精英》,到如今虚幻5(Unreal Engine 5)与REDengine驱动的3A大…

2026/10/10 5:30:25 阅读更多 →
嵌入式Linux内核移植实战:从交叉编译到启动验证全流程解析

嵌入式Linux内核移植实战:从交叉编译到启动验证全流程解析

1. 项目概述:从零到一,构建你的嵌入式Linux内核搞嵌入式开发的朋友,尤其是刚从单片机转向Linux的,最头疼的莫过于“系统移植”这四个字。听起来高大上,做起来却是一地鸡毛。今天我们不谈虚的,就聚焦在系统移…

2026/10/1 19:13:10 阅读更多 →

最新新闻

ESP32 ModbusTCP分片缓存设计与实现

ESP32 ModbusTCP分片缓存设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:15:40 阅读更多 →
Oracle 19c OCP原题精讲:多租户、RMAN与Flashback避坑指南

Oracle 19c OCP原题精讲:多租户、RMAN与Flashback避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:15:40 阅读更多 →
驱动开发入门指南:从字符设备到内核调试的完整路径

驱动开发入门指南:从字符设备到内核调试的完整路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:15:40 阅读更多 →
5G毫米波OTA测试攻略:FR2终端整机空口验收与暗室避坑指南

5G毫米波OTA测试攻略:FR2终端整机空口验收与暗室避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:15:40 阅读更多 →
嵌入式跨界三重门槛:机电硬件、纯软抽象与工科系统观

嵌入式跨界三重门槛:机电硬件、纯软抽象与工科系统观

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:15:40 阅读更多 →
主驱逆变器芯片选型与量产实战:从AEC-Q100到ASIL D的工程落地

主驱逆变器芯片选型与量产实战:从AEC-Q100到ASIL D的工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:14:39 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →