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

DVWA靶场通关笔记-存储型XSS(Stored Medium级别)

目录

一、存储型XSS

二、源码分析

1、index.php

2、Medium.php

3、XSS注入分析

三、渗透实战

1、渗透准备

2、弹框mooyuan

3、弹框cookie


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

一、存储型XSS

存储型XSSStored Cross-Site Scripting是恶意脚本被持久化保存到服务器(如数据库、文件等),当其他用户访问包含该脚本的页面时自动执行。常见于留言板、评论系统等用户提交内容被展示的场景。相对于上一章节的反射型XSS,存储型XSS与反射型XSS的主要区别如下所示。

对比项存储型 XSS反射型 XSS
攻击向量存储恶意脚本存储在目标服务器(如数据库)恶意脚本仅在 URL 参数等地方,不存储在服务器
触发条件受害者访问包含恶意脚本的页面(如论坛帖子)受害者点击特制链接或提交含恶意代码的表单
持久性长期有效,直到内容被管理员删除单次有效,仅当前请求 - 响应周期生效
传播范围影响所有访问该页面的用户仅影响点击链接的特定用户
典型场景评论区、留言板、用户资料等搜索结果、错误提示、登录表单反馈等
防御重点严格过滤用户输入并转义输出内容对 URL 参数等外部输入进行严格校验和编码

二、源码分析

1、index.php

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

这段代码是DVWA(Damn Vulnerable Web Application)中存储型XSS的演示页面,主要功能包括:初始化DVWA环境、连接数据库、提供留言板表单(包含姓名和消息输入字段)、根据安全等级(low/medium/high/impossible)加载不同的处理逻辑、支持清空留言板(TRUNCATE),并在页面上显示留言内容和相关参考资料。代码的处理逻辑具体如下所示。

  • 环境初始化:设置路径常量,加载DVWA核心文件,启动会话和PHPIDS安全检测。
  • 页面配置:设置页面标题、ID及帮助按钮。
  • 数据库连接:dvwaDatabaseConnect() 建立MySQL连接。
  • 清空留言板:通过TRUNCATE语句清除所有留言(触发条件:btnClear提交)。
  • 安全等级控制:根据Cookie中的security值加载对应的文件(low.php/medium.php/high.php/impossible.php)。
  • 留言板表单:提供姓名(txtName,限10字符)和消息(mtxMessage,限50字符)的输入字段。
  • CSRF防护:仅在impossible级别添加令牌验证(tokenField())。
  • 动态内容渲染:{$html}显示文件处理后的内容,dvwaGuestbook()展示历史留言。

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

<?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: Stored Cross Site Scripting (XSS)' . $page['title_separator'] . $page['title'];// 设置当前页面ID(用于标识)
$page['page_id'] = 'xss_s';// 设置帮助按钮和源码按钮的链接目标
$page['help_button'] = 'xss_s';
$page['source_button'] = 'xss_s';// 连接数据库
dvwaDatabaseConnect();// 检查是否点击了"Clear Guestbook"按钮(清空留言板)
if (array_key_exists("btnClear", $_POST)) {// 执行SQL清空guestbook表$query = "TRUNCATE guestbook;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false) . '</pre>');
}// 根据Cookie中的安全等级加载对应的文件
$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_s/source/{$vulnerabilityFile}";// 构建页面主体HTML
$page['body'] .= "
<div class=\"body_padded\"><h1>Vulnerability: Stored Cross Site Scripting (XSS)</h1><div class=\"vulnerable_code_area\"><form method=\"post\" name=\"guestform\"><table width=\"550\" border=\"0\" cellpadding=\"2\" cellspacing=\"1\"><tr><td width=\"100\">Name *</td><td><input name=\"txtName\" type=\"text\" size=\"30\" maxlength=\"10\"></td></tr><tr><td width=\"100\">Message *</td><td><textarea name=\"mtxMessage\" cols=\"50\" rows=\"3\" maxlength=\"50\"></textarea></td></tr><tr><td width=\"100\">&nbsp;</td><td><input name=\"btnSign\" type=\"submit\" value=\"Sign Guestbook\" onclick=\"return validateGuestbookForm(this.form);\" /><input name=\"btnClear\" type=\"submit\" value=\"Clear Guestbook\" onClick=\"return confirmClearGuestbook();\" /></td></tr></table>";// 如果是最高防护等级,添加CSRF令牌
if($vulnerabilityFile == 'impossible.php')$page['body'] .= tokenField();// 继续构建页面(包含动态生成的HTML内容和历史留言)
$page['body'] .= "</form>{$html}</div><br />" . dvwaGuestbook() . "<br /><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>";// 输出最终生成的HTML页面
dvwaHtmlEcho($page);
?>

2、Medium.php

进入DVWA靶场源目录,找到源码Medium.php,对比low.php源码如下所示。

相比low.php,主要增加了htmlspecialcharsstr_replace('<script>', '', $name )两个处理逻辑,如下所示。Medium.php源码内容如下所示。

Medium这段代码实现了一个留言板的数据提交功能。它接收用户输入的姓名和留言内容,对留言内容进行了多重处理(包括去除HTML标签、转义特殊字符、SQL注入防护和HTML编码),对姓名进行了简单的脚本标签过滤和SQL转义,最后将数据插入数据库。具体如下所示。

  • 输入获取:通过$_POST接收mtxMessage和txtName
  • 输入获取:通过$_POST接收mtxMessage和txtName
  • 留言板输入处理
    • trim():去除首尾空格
    • addslashes() + strip_tags():转义并移除HTML标签
    • htmlspecialchars():HTML实体编码
  • name输入处理
    • str_replace():移除<script>标签
    • mysqli_real_escape_string():转义SQL特殊字符
  • 错误处理:SQL错误时显示详细报错信息

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

<?php
// 检查用户是否点击了提交按钮(btnSign)
if(isset($_POST['btnSign'])) {// 获取用户输入的留言和姓名,并去除首尾空格$message = trim($_POST['mtxMessage']);$name = trim($_POST['txtName']);// 对留言内容进行安全处理:$message = strip_tags(addslashes($message)); // 先转义特殊字符再移除HTML标签// 转义SQL特殊字符防止注入(兼容性写法)$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call!", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars($message); // HTML实体编码// 对姓名进行安全处理:$name = str_replace('<script>', '', $name); // 简单过滤<script>标签// 转义SQL特殊字符$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call!", E_USER_ERROR)) ? "" : ""));// 将数据插入数据库(使用字符串拼接SQL语句)$query = "INSERT INTO guestbook (comment, name) VALUES ('$message', '$name');";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');
}
?>

3、XSS注入分析

虽然采取了多种防护措施,但Name处仍存在被存储型XSS攻击的可能性,原因如下所示。

  • 留言内容安全:经过strip_tags()htmlspecialchars()双重处理,理论上安全。
  • 姓名name输入处理不足
    • 仅移除<script>标签,未处理其他HTML标签和事件属性。
    • 未使用htmlspecialchars()对姓名进行编码。

三、渗透实战

1、渗透准备

配置security为Medium级别,具体如下所示。

进入到存储型XSS关卡Low页面,这是一个留言板的页面,具体如下所示。

http://127.0.0.1/dvwa/vulnerabilities/xss_s/ 

2、弹框mooyuan

name注入语句为“<script>alert('MOOYUAN')</script>”,由于name部分的过滤<script>标签,但因为没有对其大小写限制,将<script>替换为<Script>,于是name部分注入语句变为“<Script>alert('MOOYUAN')</script>”,将message输入1,效果如下所示,name部分被截断。

此时猜测是前段长度截断导致的,在name输入框右键元素,如下所示。

此时猜测是前段长度截断导致的,在name输入框右键元素,如下所示。

此时发现maxlength的长度为10,这说明注入长度大于10导致截断,具体如下图所示。

为了绕过前端的前场限制使XSS注入渗透成功,我们将maxlength由10改为100,此时再次在name处填写注入语句“<Script>alert('MOOYUAN')</script>”,如下所示name部分可以完全显示,效果如下所示。

点击sign guestbook后效果如下,展示留言板列表后渗透成功,弹框“MOOYUAN”。 

再次进入存储型XSS关卡的low级别页面(此时使用vmnet8对应的网卡ip地址192.168.59.1访问dvwa靶场),再次弹框,如下所示。

此时点击确定后,再次点击clear guestbook,清除有XSS注入语句的留言板,便于后续注入不被影响,如下所示。

3、弹框cookie

注入语句为“<img src=0 οnerrοr=alert(document.cookie)>”,在name输入框右键元素,将maxlength改为100,输入注入语句“<img src=0 οnerrοr=alert(document.cookie)>”,留言处填入2,效果如下所示。

点击sign guestbook后效果如下,展示留言板列表后渗透成功,弹框cookie值。

再次进入存储型XSS关卡的low级别页面(此时使用vmnet8对应的网卡ip地址192.168.59.1访问dvwa靶场),再次弹框,如下所示。

此时点击确定后,再次点击clear guestbook,清除有XSS注入语句的留言板,便于后续注入不被影响,如下所示。 

http://www.lryc.cn/news/587981.html

相关文章:

  • TCP心跳机制详解
  • 多客户端-服务器(select,poll)
  • 多客户端 - 服务器结构-实操
  • 如何在服务器上运行一个github项目
  • Rsyslog介绍及运用
  • 面试150 二叉树中的最大路径和
  • 26-计组-多处理器
  • K8S的平台核心架构思想[面向抽象编程]
  • 自动驾驶数据仓库:时间片合并算法。
  • ether.js—6—contractFactory以部署ERC20代币标准为例子
  • 0201-solidity基础-区块链-web3
  • OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战
  • 虚拟货币交易:游走在合法与犯罪的生死线
  • 排序树与无序树:数据结构中的有序性探秘
  • 【【异世界历险之数据结构世界(二叉树)】】
  • 交换类排序的C语言实现
  • 删除当前项目关联的远程仓库(remote)
  • C#结构体:值类型的设计艺术与实战指南
  • 基于ASP.NET+SQL Server实现(Web)排球赛事网站
  • iOS高级开发工程师面试——RunTime
  • JAVA面试宝典 - 《MyBatis 进阶:插件开发与二级缓存》
  • 多尺度频率辅助类 Mamba 线性注意力模块(MFM),融合频域和空域特征,提升多尺度、复杂场景下的目标检测能力
  • 华曦达港股IPO丨AI Home生态构建,开启智能家居新篇章
  • 《Librosa :一个专为音频信号处理和音乐分析设计的Python库》
  • ServBay Windows 1.3.0 更新!新增系统监控与 Nginx 配置升级
  • [spring6: Resource ResourceLoader]-加载资源
  • GPT-4和Claude哪个好
  • UML建模和设计模式——常考点整理
  • VScode链接服务器一直卡在下载vscode服务器,无法连接成功
  • 视频动态范围技术演进:从SDR到HDR的影像革命