pikachu靶场通关笔记07 XSS关卡03-存储型XSS

article/2025/8/22 6:03:24

目录

一、XSS

二、存储型XSS

三、源码分析

四、渗透实战

1、输入mooyuan试一试

2、注入Payload

3、查看数据库

4、再次进入留言板页面


本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到XSS风险的真实原因,讲解XSS的原理并进行渗透实践,本文为XSS关卡03-存储型XSS的渗透部分。

一、XSS

XSS 全称为跨站脚本攻击(Cross - Site Scripting),因其高危害性长期位列OWASP Top 10安全威胁。攻击者通过注入恶意脚本(通常为JavaScript)到网页中,脚本在其浏览器执行。XSS主要分为3种类别,具体如下表所示。

类型存储方式触发条件危害范围典型场景防御重点
存储型XSS恶意脚本永久存储在服务器用户访问包含恶意脚本的页面所有访问用户论坛评论区、用户资料页输入过滤+输出编码
反射型XSS不存储,通过URL参数传递用户点击特制恶意链接单个点击用户搜索框、错误页面URL参数消毒+CSP策略
DOM型XSS不经过服务器,纯前端风险前端JS动态解析恶意构造的输入执行恶意代码的用户单页应用(SPA)、URL哈希值安全的DOM操作+前端过滤

二、存储型XSS

存储型XSS(持久性跨站脚本攻击)是XSS风险中最严重的一种类型,其特点是恶意脚本被永久存储在目标服务器上(如数据库、文件系统等),当其他用户访问包含该恶意脚本的页面时,脚本会自动在其浏览器中执行,造成持续性的安全威胁。

这类攻击常见于用户提交内容可被重复展示的场景,如论坛评论区、用户资料页、商品评价区等Web交互功能,攻击者只需提交一次恶意代码(如包含JavaScript的评论),所有后续访问该页面的用户都会成为受害者。

分类存储型XSS
别名持久型XSS
存储位置服务器端(数据库、文件系统等)
触发方式用户访问被注入的页面时自动执行
攻击场景论坛评论、用户资料、商品评价等可存储用户输入的交互功能
危害范围所有访问被污染页面的用户
攻击特点长期存在,无需诱导点击(与反射型XSS不同)
修复难度高(需清理数据库中已存储的恶意脚本)

存储型XSS的危害性极大,可导致大规模用户数据泄露(如窃取登录凭证、会话Cookie)、网页内容篡改(如植入钓鱼表单),甚至传播恶意软件。由于恶意脚本存储在服务器,其影响会持续存在,直到被人工清除。

三、源码分析

进入pikachu靶场XSS系列种的第03关卡-存储型XSS页面,打开后发现是一个留言板,如下所示。

http://127.0.0.1/pikachu/vul/xss/xss_stored.php

查看存储型XSS关卡源码xss_stored.php文件内容,通过POST传入的参数message会被存储到数据库,且没有对message参数进行转义HTML特殊字符的过滤,说明有XSS存储型风险,具体如下所示。

接下来对源码进行详细注释,具体如下所示。

// 调用 connect 函数,建立与数据库的连接,并将返回的连接对象赋值给变量 $link
// 这个函数应该是自定义的,用于封装数据库连接的逻辑
$link = connect();// 初始化一个空字符串变量 $html,用于存储后续要输出的提示信息
$html = '';// 检查 $_POST 数组中是否存在键为 "message" 的元素,并且该元素的值不为 null
// 即判断用户是否通过 POST 请求提交了名为 "message" 的数据
if (array_key_exists("message", $_POST) && $_POST['message'] != null) {// 调用 escape 函数,对用户输入的 "message" 数据进行转义处理// 该函数可能是自定义的,用于防止 SQL 注入攻击,将特殊字符进行转义// 传入数据库连接对象 $link 和用户输入的 "message" 数据作为参数$message = escape($link, $_POST['message']);// 构建一个 SQL 插入语句,将用户输入的 "message" 数据插入到名为 "message" 的数据库表中// 插入的数据包含两个字段:content 存储用户输入的消息内容,time 存储当前时间// 使用 now() 函数获取当前时间$query = "insert into message(content,time) values('$message',now())";// 调用 execute 函数,执行上述构建好的 SQL 插入语句// 该函数应该是自定义的,用于封装执行 SQL 语句的逻辑// 传入数据库连接对象 $link 和 SQL 语句 $query 作为参数$result = execute($link, $query);// 检查执行 SQL 语句后受影响的行数是否不等于 1// 如果不等于 1,说明插入操作可能没有成功,数据库出现异常if (mysqli_affected_rows($link) != 1) {// 如果插入操作失败,向 $html 变量中追加一段提示信息// 提示用户数据库出现异常,提交失败$html .= "<p>数据库出现异常,提交失败!</p>";}
}

这段代码存在存储型 XSS风险,具体原因如下。

  • 仅进行 SQL 转义,未对 XSS 攻击进行防护:虽然代码调用了 escape 函数对用户输入进行处理,其目的可能是为了防止 SQL 注入,但这个处理并没有考虑到 XSS 攻击的情况。escape 函数可能只是对 SQL 语句中的特殊字符进行转义,而没有对可能的 HTML 标签和 JavaScript 代码进行处理。
  • 未对输出内容进行过滤和转义:当这些包含恶意脚本的内容从数据库中取出并显示在网页上时,由于没有对输出内容进行过滤和转义,浏览器会将其中的脚本代码解析并执行,从而导致 XSS 攻击。任何访问该页面的用户都会受到影响,因为恶意脚本会被存储在数据库中并持续影响后续的页面访问。  

其中escape函数为自定义函数,在mysql.inc.php文件中定义,具体如下所示。

/*** 对数据进行转义处理,防止 SQL 注入攻击** 该函数可以处理字符串和数组类型的数据。对于字符串,使用 mysqli_real_escape_string 函数进行转义;* 对于数组,会递归调用自身对数组中的每个元素进行转义处理。** @param mysqli $link 数据库连接对象,用于 mysqli_real_escape_string 函数* @param mixed $data 需要进行转义处理的数据,可以是字符串或数组* @return mixed 转义后的数据,保持与输入数据相同的类型(字符串或数组)*/
function escape($link, $data) {// 检查传入的数据是否为字符串类型if (is_string($data)) {// 如果是字符串,使用 mysqli_real_escape_string 函数对字符串进行转义// 该函数会对字符串中的特殊字符(如单引号、双引号、反斜杠等)进行转义,防止 SQL 注入// 返回转义后的字符串return mysqli_real_escape_string($link, $data);}// 检查传入的数据是否为数组类型if (is_array($data)) {// 如果是数组,遍历数组中的每个元素foreach ($data as $key => $val) {// 递归调用 escape 函数,对数组中的每个元素进行转义处理// 将转义后的元素重新赋值给数组中对应的键$data[$key] = escape($link, $val);}}// 如果数据既不是字符串也不是数组,直接返回原始数据return $data;
}

    四、渗透实战

    1、输入mooyuan试一试

    进入靶场的xss存储型关卡,如下所示是一个留言板页面,尝试输入mooyuan。

    此时可以通过数据库管理软件,查看pikachu的message表,如下所示表中有一条为mooyuan的内容,说明留言板写入内容mooyuan被存储到数据库中。

    2、注入Payload

    XSS注入语句<script>alert("mooyuan")</script>的含义如下所示。

    • <script> 标签:HTML 中定义 JavaScript 代码块的标记。
    • alert("mooyuan"):调用浏览器的弹窗函数,显示内容为 mooyuan 的警告框。
    • 整体作用:当该脚本被浏览器解析时,会立即弹出警示框。
    <script>alert("mooyuan")</script>
    

    输入<script>alert("mooyuan")</script>,弹框显示mooyuan说明渗透成功,如下所示。

    3、查看数据库

     查看数据库,如下所示XSS脚本被写入数据库。

    4、再次进入留言板页面

    更换浏览器访问存储型XSS页面,进入页面即弹框mooyuan,触发了XSS脚本的执行,渗透成功。

    http://127.0.0.1/pikachu/vul/xss/xss_stored.php

    点击确定后,页面如下所示。


     
    可以通过点击最下面的删除,将注入的恶意XSS脚本删除。 


    http://www.hkcw.cn/article/WHeCDVutOl.shtml

    相关文章

    Windows【基础操作1】

    目录 前言&#xff1a; 二、Windows磁盘管理 1.磁盘分区 2.磁盘管理 总结 前言&#xff1a; 好 上一篇我讲了关于windows文件夹的操作以及一些属性知识什么的 我们这里就接着上一篇最后留下的问题来讲解 好 我们开始讲解的是windows 的磁盘 一、磁盘是什么&#xff1f; W…

    英国人为抢Labubu大打出手 潮流玩具引发全球热潮

    英国人为抢Labubu大打出手 潮流玩具引发全球热潮!泡泡玛特旗下的IP“Labubu”从一款小众设计师玩具迅速成长为国际潮流偶像。最新上市的Labubu系列在美国、英国等地经常几分钟内售罄。由于需求旺盛,伦敦斯特拉特福德韦斯特菲尔德购物中心甚至发生斗殴事件。部分零售专家警告,…

    数据仓库分层 4 层模型是什么?

    企业每天都在产生和收集海量数据。然而&#xff0c;面对这些数据&#xff0c;许多企业却陷入了困境&#xff1a;如何高效管理、处理和分析这些数据&#xff1f;如何从数据中提取有价值的信息来支持业务决策&#xff1f;这些问题困扰着众多数据分析师和 IT 管理者。 在众多架构…

    Transformer模型:多头注意力机制深度解析

    在多头注意力机制里&#xff0c;输入的查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;会被投影到多个子空间&#xff08;头&#xff09;进行并行计算&#xff0c;每个头关注输入序列的不同方面。在所有头的注意力计算完成…

    刑拘!男子在家自学制售假币还收徒 网络“发财”梦破灭

    七星关公安分局经侦大队民警在洪山街道虎踞路将涉嫌制售假币的余某抓获。在余某住处,警方收缴了464张假币以及电脑、打印机等制作工具。据余某交代,他在某APP上浏览时收到一条陌生人私信,得知有制作假币这条“发财”路。经过详细了解后,余某根据对方教授的步骤,在某软件上…

    02.K8S核心概念

    服务的分类 有状态服务&#xff1a;会对本地环境产生依赖&#xff0c;例如需要把数据存储到本地磁盘&#xff0c;如mysql、redis&#xff1b; 无状态服务&#xff1a;不会对本地环境产生任何依赖&#xff0c;例如不会存储数据到本地磁盘&#xff0c;如nginx、apache&#xff…

    搭建MQTT服务器

    搭建MQTT服务器 安装EMQX命令配置 EMQX Apt 源&#xff1a;安装 EMQX启动 EMQX 卸载EMQX登录EMQX控制台开放端口打开测试MQTT通信 MQTT客户端测试添加客户端认证配置 客户端授权配置API接口说明安装MySQL数据库1. 下载 MySQL APT 配置包2. 安装仓库配置包3. 更新系统包索引4. 安…

    【博客系统】博客系统第十一弹:部署博客系统项目到 Linux 系统

    搭建 Java 部署环境 apt apt&#xff08;Advanced Packaging Tool&#xff09;是 Linux 软件包管理工具&#xff0c;用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。 大多数 apt 命令必须以具有 sudo 权限的用户身份运行。 apt 常用命令 列出…

    如何利用categraf的exec插件实现对Linux主机系统用户及密码有效期进行监控及告警?

    需求描述 Categraf作为夜莺监控平台的数据采集工具&#xff0c;为了保障Linux主机的安全&#xff0c;需要实现对系统用户密码有效期的监控&#xff0c;并在密码即将到期时及时告警&#xff0c;以提醒运维人员更改密码。本章将详细介绍如何利用Categraf的exec插件来实现这一功能…

    Houdini POP入门学习02

    本篇继续随教程学习POP&#xff0c;并附带学习一些wrangle知识点等。 1.新建空项目&#xff0c;添加Geometry sphere小球。 2.连接popnet&#xff0c;现在粒子随小球形态发射 3.双击进入popnet&#xff0c;在wire_pops_into_here处连接popwind&#xff0c;添加风力 4.设置Wind…

    《藏海传》平津侯被斩首!着实让人恨的牙痒痒

    《藏海传》平津侯被斩首。藏海传演到今天,目前最大的反派就是平津侯,他霸道强势,杀人如麻,掌控许多人的命运,又有实力派演员黄觉演绎,着实让人恨的牙痒痒。平津侯名字庄芦隐,战功赫赫,他一副正义凛然不信鬼神之说的样子,其实并不是。他逼杀藏海父母,都知道是为了癸玺…

    哪吒汽车总部LOGO被连夜拆除?公司回应!原CEO张勇名下超4000万股权被冻结 搬迁与股权冻结引关注

    哪吒汽车上海总部外墙的“哪吒汽车”LOGO已被拆除,一同被拆除的还有位于总部的哪吒体验中心标志。据透露,拆除原因是场地到期,公司即将搬家。具体的新办公室地址尚未公布。哪吒汽车原CEO张勇名下股权被冻结,金额为4050万元,冻结期限从2025年5月13日至2028年5月12日。张勇是…

    特朗普政府请求上诉法院暂停关税裁决 裁决暂时搁置

    5月29日,美国联邦巡回上诉法院批准了特朗普政府的请求,暂时搁置了美国国际贸易法院此前做出的禁止执行依据《国际紧急经济权力法》对多国加征关税措施的裁决。联邦巡回上诉法院表示,在审议相关动议文件期间,美国国际贸易法院在这些案件中作出的判决和永久性禁令将暂时中止,…

    禁招国际生案哈佛再获胜 美政府改立场

    禁招国际生案哈佛再获胜 美政府改立场提出“30天限期”当地时间29日,美国马萨诸塞州联邦地区法院一名法官批准了哈佛大学提出的发布初步禁令请求,“叫停”特朗普政府取消哈佛大学招收外国学生资质的政策。该法院法官艾莉森伯勒斯29日就该案举行听证会。法院网站最新信息显示,…

    中国对沙特等4国试行免签!欢迎说走就走的中国行

    5月28日,外交部发言人毛宁主持例行记者会。有记者提问称,中方在东盟-中国-海合会峰会期间宣布对沙特等四国试行免签政策,希望了解具体情况。毛宁表示,为便利中外人员往来,中方决定扩大免签国家范围。自2025年6月9日至2026年6月8日,对沙特、阿曼、科威特、巴林持普通护照人…

    【Unity基础】Unity新手实战教程:用ScriptableObject控制Cube颜色

    目录 项目概述&#x1f6e0;️ 完整操作步骤&#xff08;10分钟内完成&#xff09;步骤1&#xff1a;创建ScriptableObject类步骤2&#xff1a;创建颜色配置资产步骤3&#xff1a;创建Cube控制器步骤4&#xff1a;设置场景和Cube步骤5&#xff1a;添加简单UI提示步骤6&#xff…

    美宣布撤销中国留学生签证 我使馆:已提出严正交涉

    美方宣布撤销中国留学生签证 我使馆:已提出严正交涉关于美国务院发表声明称将撤销有关中国在美留学生签证一事,中国驻美使馆发言人5月29日在回答媒体提问时表示,中方坚决反对美方这一政治性、歧视性做法。中国驻美使馆表示,美方此举将严重损害中国在美留学人员正当合法权益…

    硅基计划2.0 学习总结 伍 类的继承 初稿

    文章目录 一、 继承1. 为什么要继承2. 如何继承3. 情况一&#xff1a;子父类成员变量重名4. 情况二&#xff1a;子父类成员方法重名5. 子父类构造方法问题6. 继承中代码块调用顺序7. protected关键字7. 继承方式8. final关键字9. 继承和组合 一、 继承 1. 为什么要继承 假设一…

    长安链合约操作 查询合约命令解析

    这个命令使用 ChainMaker 的 cmc 客户端工具查询智能合约 fact 的 find_by_file_hash 方法&#xff0c;通过文件哈希值检索链上存储的数据。以下是详细解析&#xff1a; 命令功能 调用合约 fact 的 查询方法 find_by_file_hash&#xff0c;根据文件哈希值 ab3456df5799b87c77…

    嵌入式开发之STM32学习笔记day15

    STM32F103C8T6 USART串口协议 1 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 …