XSS | 存储型 XSS 攻击

news2024/11/18 7:51:35

关注这个漏洞的其他相关笔记:XSS 漏洞 - 学习手册-CSDN博客

0x01:存储型 XSS —— 理论篇

存储型 XSS 又称持久型 XSS,攻击脚本将被永久的存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

常见的攻击方式: 这种攻击多见于论坛、博客、留言板,攻击者在发帖过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。

其攻击流程如下图所示:

从上面的攻击流程中,我们可以看到,存储型 XSS 的攻击方式能将恶意代码永久的嵌入一个页面中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型 XSS 攻击将没有多大作为,而存储型 XSS 则不同,由于它注入在一些我们信任的页面,因此无论我们多么小心,都难免会受到攻击(谁会一直打开浏览器的源码模式抓包呀)。

0x02:存储型 XSS —— 实战篇

实验工具准备

  • PHP 运行环境:phpstudy_x64_8.1.1.3.zip(安装教程:PhpStudy 安装-CSDN博客)

  • PIKACHU 靶场:pikachu-master.zip (安装教程:PIKACHU 靶场初识-CSDN博客)

本次实验采用的是现成的 PIKACHU 靶场,该靶场的搭建流程参考上面的链接,这里就不多说了。

0x0201:存储型 XSS 攻击

在浏览器的导航栏中输入下面的网址,访问 PIKACHU 靶场中的存储型 XSS 漏洞地址:

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

可以看到是一个留言板,我们可以写几条留言看看:

从上图可以看出来,使用不同的浏览器,在不同的时刻去查看之前的留言,都是能看到相同的内容的。

我们鼠标右击页面,查看一下网页源码:

可以发现,我们传入的内容直接回显在了 <p> 标签中。那么我们尝试留言一个 JavaScript 脚本看看呢:

 <script>alert(/You've Been Tricked/)</script>

留言之后,点击 submit 页面直接弹窗了。此时,查看一下留言板的网页源码:

可以看到,我们之前留言的 JavaScript 脚本被成功嵌入到了前端页面中,此时我们使用另一个浏览器访问当前页面,模拟其他用户的登录操作:

可以看到,其他用户一访问这个存在存储型 XSS 漏洞的站点,就收到了弹窗,证明被 XSS 攻击了。至此,存储型 XSS 攻击的全流程演示完毕。

0x0202:存储型 XSS 代码分析

下面是触发存储型 XSS 漏洞的关键代码:

<?php
 $link = connect(); // 获取数据库连接对象
 $html = '';
 if (array_key_exists("message", $_POST) && $_POST['message'] != null) {
     // 如果 POST 请求中存在 message 字段,且 message 字段不为空
     $message = escape($link, $_POST['message']); // 对传入的数据进行转义,避免 SQL 注入漏洞
     $query = "insert into message(content,time) values('$message',now())"; 
     $result = execute($link, $query);// 执行 $query 中的内容,将客户端传递的留言插入到数据库中
     if (mysqli_affected_rows($link) != 1) {
         $html .= "<p>数据库出现异常,提交失败!</p>";
     }
 }
 ?>
 ​
 <div id="xsss_main">
     <p class="xsss_title">我是一个留言板:</p>
         <form method="post">
             // 用户留言的地方,在 textarea 中填写留言后,点击 submit 即可以 POST 方式提交到当前页面,后续会被直接插入到数据库中
             <textarea class="xsss_in" name="message"></textarea><br />
             <input class="xsss_submit" type="submit" name="submit" value="submit" />
         </form>
         <div id="show_message"><br /><br />
             <p class="line">留言列表:</p>
             <?php 
             echo $html;
             $query = "select * from message";
             $result = execute($link, $query); // 查询数据库中存放的所有留言
             while ($data = mysqli_fetch_assoc($result)) { 
                 // 遍历查询出来的结果,并拼接回显
                 echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>"; // 将数据库中的留言渲染回页面
             }
             echo $html;
             ?>
         </div>
 </div>

用户在留言板中留言后,通过 <form> 表单,将数据传递给后端,后端接收到用户的数据后,使用自己编写的 escape() 函数对用户传入的内容进行了转义,从而避免了 SQL 注入攻击。转义完成后就将用户提交的内容插入到了数据库中。在接下来的逻辑中,目标将数据库中存储的内容直接回显回了页面,没有做任何的过滤,导致出现了 XSS 漏洞。

从上面的代码分析来看,目标只在将用户提交的信息插入数据库的时候做了一次过滤,我们看一下其过滤逻辑:

 //转义,避免fuck
 function escape($link,$data){
     if(is_string($data)){
         // 传入的如果是字符串,就直接使用 mysqli_real_escape_string() 进行转义
         return mysqli_real_escape_string($link,$data);
     }
     if(is_array($data)){
         // 传入的如果是数组,则对没个元素都使用 mysqli_real_escape_string() 进行转义
         foreach ($data as $key=>$val){
             $data[$key]=escape($link,$val);
         }
     }
     return $data;
 }

mysqli_real_escape_string() 函数的定义与用法如下图所示:

可以发现该函数只转义在 SQL 语句中使用的字符串中的特殊字符。并不包括我们在 XSS 中常用的 <> 这些特殊符号,所以目标后端只对输入时的 SQL 注入做了防范,但对 XSS 并未做防御。

所以,当用户在留言板中写入 <script>alert(/You've Been Tricked/)</script>时,数据库中的数据如下图所示:

当其他用访问该留言板时,页面回显并执行了 <script>alert(/You've Been Tricked/)</script>,导致弹窗。

0x03:参考文献

  • 《Web 安全攻防:渗透测试实战指南》 ISBN 978-7-121-34283-7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件&#xff01;阅读帖子直到最后&#xff0c;了解如何做到这一点。 为了获得安全更新并使用最新的操作系统&#xff0c;人们会升级到最新版本的 Windows。然而&#xff0c;在这样做的过程中&#xff0c;许多人丢失了他们的重要文件&#…

Dynamics 365 dependency EntityType

导解决方案时经常会碰到组件依赖导致导入报错&#xff0c;而错误提示中组件只有type, 比如下图中的type 20和60, 初看之下并不知道是什么意思&#xff0c;从parentDisplayName能看出来&#xff0c;这个parent是个实体&#xff0c;但实体中的什么呢&#xff0c;目测是看不出来的…

8621 二分查找

**思路&#xff1a;** 1. 读取输入的元素个数 n。 2. 读取有序数组 ST。 3. 读取要查找的关键字 key。 4. 使用折半查找法&#xff08;即二分查找&#xff09;在数组 ST 中查找 key 的位置。 5. 如果找到 key&#xff0c;输出其位置&#xff1b;如果未找到&#xff0c;输出 &qu…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词&#xff1a;h5离线包加载、h5离线包更新、沙箱 在上一篇文章中&#xff0c;我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下&#xff0c;那么该篇文章将介绍如何加载该沙箱目录下的文件资源&#xff08;此处以打包后的web资源为例&#xff09;&#xf…

5.模拟电子技术笔记——放大电路的分析方法

写在前面 这个是模电的第五次笔记&#xff0c;祝大家学习愉快&#xff01; 笔记部分 1.图解法 我们这节的所有电路都默认是共射放大电路&#xff0c;后面如果没有特殊说明都是共射极的。 1.1 静态工作点的图解分析 我们接下来画出这个电路的直流回路 我们先考察它的输入回…

【redis-04】Redisson实现分布式锁实战和源码剖析

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

ubuntu切换源方式记录(清华源、中科大源、阿里源)

文章目录 前言一、中科大源二、清华源三、阿里源 前言 记录ubunut切换各个源的方式。 备注&#xff1a;更换源之后使用sudo apt-get update更新索引。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、中科大源 地址&#xff1a;https://mirrors.u…

【Golang】Go语言字符串处理库--strings

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

RK3588主板PCB设计学习(一)

DCDC电路可以直接参考数据手册&#xff1a; 电源输出3A&#xff0c;回流GND也应该是3A&#xff0c;回流路径和输出路径的电流是一致的&#xff0c;不要输出路径布线很粗&#xff0c;GND回流路径很细&#xff0c;并且应该保证回流面积最小&#xff1a; 这一点讲的很到位&#xf…

《深度学习》OpenCV 指纹验证、识别

目录 一、指纹验证 1、什么是指纹验证 2、步骤 1&#xff09;图像采集 2&#xff09;图像预处理 3&#xff09;特征提取 4&#xff09;特征匹配 5&#xff09;相似度比较 6&#xff09;结果输出 二、案例实现 1、完整代码 2、实现结果 调试模式&#xff1a; 三、…

华为云LTS日志上报至观测云最佳实践

华为云LTS简介 华为云云日志服务&#xff08;Log Tank Service&#xff0c;简称 LTS&#xff09;&#xff0c;用于收集来自主机和云服务的日志数据&#xff0c;通过海量日志数据的分析与处理&#xff0c;可以将云服务和应用程序的可用性和性能最大化&#xff0c;为您提供实时、…

音乐项目总结(终)

总的来说写这个项目还是状态差了&#xff0c;前期中期写太慢&#xff0c;后期疯狂赶。 讲点对写这个项目能想起来解决的问题和写的的感触。 前期&#xff1a;当时觉得时间很充足&#xff0c;有布置算法题&#xff0c;我竟然还花三四天去学算法&#xff0c;&#xff0c;动态规划…

【软设】项目管理

【软设】项目管理 (要会根据Gantt和Pert图求关键路径&#xff0c;可以看3.3的示例来了解Pert图) 一.进度管理 进度管理 是项目管理的重要组成部分&#xff0c;旨在确保项目在规定的时间范围内完成。进度管理不仅包括项目活动的规划&#xff0c;还包括监控和控制项目活动的进…

LeetCode 热题 100 回顾8

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】

将 Mixture-of-Experts 应用于 Transformers 既然我们已经研究了条件计算的早期工作&#xff0c;那么我们就可以看看 MoE 在变换器架构中的一些应用。 如今&#xff0c;基于 MoE 的 LLM 架构&#xff08;如 Mixtral [13] 或 Grok&#xff09;已广受欢迎&#xff0c;但 MoE 在语…

【C++题目】7.双指针_和为 s 的两个数字

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; LCR 179.查找总价格为目标值的两个商品 题目描述&#xff1a; 解法 解法一&#xff08;暴力解法&#xff0c;会超时&#xff09; 两层 for 循环列出所有两个数字的组合…

网络通信(学习笔记)

InputStreamReader 是 Java 中的一个类&#xff0c;它可以将字节输入流转换为字符输入流。它可以读取字节输入流&#xff0c;并使用指定的字符集将字节解码为字符。 InputStreamReader继承了Reader类 Scanner scanner new Scanner(System.in);//这是一个控制台输入的一个类&am…

巡检机器人室内配电室应用

智能巡检系统实施背景 电力系统发展已进入电气化、自动化、智能化建设加速推进的新阶段&#xff0c;设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0c;装备水平取得长足发展&#xff0c;与此同时设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0…

JAVA并发编程高级——JDK 新增的原子操作类 LongAdder

LongAdder 简单介绍 前面讲过,AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong 时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,…

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…