当前位置: 首页 > news >正文

DVWA靶场通关笔记-反射型XSS(Reflected Medium级别)

目录

一、XSS

二、反射型XSS

三、源码分析

1、index.php

2、Medium.php

四、渗透实战

1、渗透准备

2、大小写绕过注入

3、获取cookie

4、IMG注入


DVWA(Damn Vulnerable Web Application)中的反射型XSS关卡(Reflected)是用于练习和演示反射型XSS的不同场景,不同安全等级存在不同的脆弱点和绕过方法,本小节对中等级别的关卡进行渗透实战。

一、XSS

XSS(Cross-Site Scripting) 指的是攻击者通过在网页中注入恶意脚本,当用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话信息或进行其他恶意操作。核心原理就是未对用户输入或输出进行适当过滤,导致恶意代码被浏览器解析执行。

XSS类型

位置

数据流向

反射型 XSS

服务器端

用户输入 → 服务器 → 响应中包含恶意代码

存储型 XSS

服务器端

用户输入 → 存储(数据库) → 所有用户访问时触发

DOM XSS

客户端 JavaScript 代码

用户输入 → 浏览器 DOM 操作 → 执行恶意代码

二、反射型XSS

反射型XSSReflected Cross-Site Scripting是一种常见的Web安全攻击,攻击者将恶意脚本注入URL参数中,当用户点击包含该参数的链接时,服务器将恶意代码反射到响应页面并执行。

三、源码分析

1、index.php

进入DVWA靶场源目录,找到index.php源码。

这段代码是DVWA靶场中反射型XSS攻击的演示页面,主要功能如下所示。

  • 初始化设置

    • 定义系统路径常量,加载必要文件,启动DVWA环境(含用户认证和安全检测)。

  • 安全等级控制

    • 根据用户Cookie中的security值(low/medium/high/impossible)动态加载不同防御级别的代码文件(low.php/medium.php/high.php/impossible.php)。

  • 反射型XSS测试界面

    • 生成一个表单,用户输入name参数并提交,服务端将输入反射到页面中(具体逻辑在引入的不同级别文件中实现)。

    • 在最高防御等级(impossible)时添加CSRF令牌。

  • 动态内容渲染

    • 变量$html由引入的不同文件生成,用于演示不同安全等级下的反射型XSS攻击效果。

 详细注释后的代码如下所示。

<?php
// 定义DVWA根目录路径常量
define('DVWA_WEB_PAGE_TO_ROOT', '../../');// 引入DVWA核心页面初始化文件
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';// 启动DVWA页面,要求用户已认证并启用PHPIDS(安全检测)
dvwaPageStartup(array('authenticated', 'phpids'));// 创建新页面对象
$page = dvwaPageNewGrab();// 设置页面标题(包含名称和默认分隔符)
$page['title'] = 'Vulnerability: Reflected Cross Site Scripting (XSS)' . $page['title_separator'] . $page['title'];// 设置页面ID(用于标识当前页面)
$page['page_id'] = 'xss_r';// 设置帮助按钮和查看源码按钮的链接目标
$page['help_button'] = 'xss_r';
$page['source_button'] = 'xss_r';// 连接数据库
dvwaDatabaseConnect();// 根据安全等级选择对应的级别文件
$vulnerabilityFile = '';
switch($_COOKIE['security']) {case 'low':$vulnerabilityFile = 'low.php';    // 低安全等级break;case 'medium':$vulnerabilityFile = 'medium.php'; // 中安全等级break;case 'high':$vulnerabilityFile = 'high.php';   // 高安全等级break;default:$vulnerabilityFile = 'impossible.php'; // 最高防御等级break;
}// 引入对应安全等级的代码文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/xss_r/source/{$vulnerabilityFile}";// 构建页面主体HTML
$page['body'] .= "
<div class=\"body_padded\"><h1>Vulnerability: Reflected Cross Site Scripting (XSS)</h1><div class=\"vulnerable_code_area\"><form name=\"XSS\" action=\"#\" method=\"GET\"><p>What's your name?<input type=\"text\" name=\"name\"><input type=\"submit\" value=\"Submit\"></p>\n";// 如果是最高防御等级,添加CSRF令牌
if($vulnerabilityFile == 'impossible.php')$page['body'] .= "            " . tokenField();// 继续构建页面(包含动态生成的HTML内容和参考资料链接)
$page['body'] .= "</form>{$html}</div><h2>More Information</h2><ul><li>" . dvwaExternalLinkUrlGet('https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)') . "</li><li>" . dvwaExternalLinkUrlGet('https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet') . "</li><li>" . dvwaExternalLinkUrlGet('https://en.wikipedia.org/wiki/Cross-site_scripting') . "</li><li>" . dvwaExternalLinkUrlGet('http://www.cgisecurity.com/xss-faq.html') . "</li><li>" . dvwaExternalLinkUrlGet('http://www.scriptalert1.com/') . "</li></ul>
</div>\n";// 输出最终生成的HTML页面
dvwaHtmlEcho($page);
?>

2、Medium.php

打开源码Medium.php,分析可知这段代码仅对name传入的内容进行简单过滤,如下所示。

代码的主要功能如下所示

  • 关闭浏览器XSS保护X-XSS-Protection: 0 禁用浏览器内置的XSS过滤(现代浏览器已逐步废弃该机制,改用CSP)。

  • 获取并简单过滤用户输入:检查 name 参数是否存在,并尝试移除 <script> 字符串(但过滤方式不严谨)。

  • 输出到页面:将处理后的 name 值嵌入HTML的 <pre> 标签中返回。

很明显代码存在反射型XSS注入的可能性,具体原因如下所示。

  • 过滤不彻底仅替换 <script>。

    • 未处理其他危险标签(如 <img><svg>)或事件属性(如 onerror)。

    • 大小写绕过<SCRIPT><sCrIpT> 不会被过滤。

    • 嵌套绕过<scr<script>ipt> → 替换后仍为 <script>

  • 输出未编码:使用 ${name} 直接拼接字符串,未对 <>" 等特殊字符进行HTML实体转义。

详细注释后的代码如下所示。

<?php
// 禁用浏览器的XSS过滤器(X-XSS-Protection: 0表示关闭防护)
header("X-XSS-Protection: 0");// 检查GET请求中是否存在"name"参数且值不为NULL
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL) {// 将用户输入直接拼接到HTML中,返回给前端$html .= '<pre>Hello ' . $_GET['name'] . '</pre>';
}
?>

四、渗透实战

1、渗透准备

进入DVWA靶场,将安全级别设置为中级,具体如下所示。

打开靶场反射型XSS关卡Medium级别,此时完整URL地址如下所示。

http://127.0.0.1/dvwa/vulnerabilities/xss_r

2、大小写绕过注入

尝试注入XSS语句<script>alert('mooyuan')</script>看效果如何,由于script被过滤,使用大小写绕过方法,注入语句改为<ScRipt>alert('mooyuan')</scrIPT>,完整的URL如下所示。

http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<ScRipt>alert('mooyuan')</scrIPT>#

 如下所示渗透成功,成功弹出mooyuan弹框。

3、获取cookie

原始注入语句为<script>alert(document.cookie)</script>。由于script被过滤,使用大小写绕过方法,注入语句改为<scripT>alert(document.cookie)</Script>,完整URL如下所示。

http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<scripT>alert(document.cookie)</Script>#

通过将script大小写绕过处理后,如下图所示成功弹框获取到cookie。 

4、IMG注入

注入语句如下所示。

<img src=0 onerror=alert(/mooyuan/)>

完整的URL如下所示,成功弹框mooyuan。

http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<img+src=0+onerror=alert(/mooyuan/)>#

http://www.dtcms.com/a/273816.html

相关文章:

  • react打包发到线上报错Minified React error #130
  • 在HP小机上跑了1432天的Oracle RAC,能不能重启?
  • 【ECharts】多个ECharts版本共存解决方案
  • 日历插件-FullCalendar的详细使用
  • git lfs部署及报错处理
  • 静态路由综合配置实验报告
  • 如何安装和配置Autoptimize插件以提高WordPress网站访问速度
  • Web应用文件上传安全设计指南
  • Redis概念和基础
  • Apache Cloudberry 向量化实践(二):如何识别和定位向量化系统的性能瓶颈?
  • Django 模板(Template)
  • 你会用Github Copilot 吗 ——《内置功能详解》
  • h2数据库数据文件备份(防止异常断电导致的数据库文件无法使用,元数据块损坏等问题)
  • Oracle RAC 11.2.0.4 更新SYSASM和SYS密码
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别
  • 在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
  • 基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建
  • 鸿蒙app 开发中的 map 映射方式和用法
  • Deepseek-如何从零开始开发需要专业知识的prompt
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • [特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel
  • Ubuntu 22.04与24.04 LTS版本对比分析及2025年使用建议
  • 嵌入式学习笔记--MCU阶段--day03中断
  • sqli-labs靶场通关笔记:第5-6关 报错注入
  • Android原生TabLayout使用技巧
  • DNS(Domain Name System,域名系统)
  • 11. TCP 滑动窗口、拥塞控制是什么,有什么区别
  • 正义的算法迷宫—人工智能重构司法体系的技术悖论与文明试炼
  • KeyError: “No object named ‘MambaIRv2Model‘ found in ‘model‘ registry!“
  • iOS 数组如何设计线程安全