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

WEB攻防-通用漏洞PHP反序列化POP链构造魔术方法原生类

目录

一、序列化和反序列化

二、为什么会出现反序列化漏洞

三、序列化和反序列化演示

<演示一>

<演示二>

<演示二>

四、漏洞出现演示

<演示一>

<演示二>

四、ctfshow靶场真题实操

<真题一>

<真题二>

<真题三>

<真题四>


一、序列化和反序列化

  • 序列化:对象转换为数组或字符串等格式

        serialize()              //将一个对象转换成一个字符串

  • 反序列化:将数组或字符串等格式转换成对象

        unserialize()          //将字符串还原成一个对象

  • 比如我们在传输类似这种内容的时候,内容里包括很多空格,传输起来容易发生错误,也比较浪费空间。

  • 因此就将其转换为了字符串或者数组的形式去发送,之后再进行反序列化就可以将原本的数据输出出来,这样可以使数据传输更加稳定,效率也更高。

二、为什么会出现反序列化漏洞

        在php里有时会存在一些魔术方法,可以控制优先执行什么或者初始化什么,但是如果魔术方法使用不当,就可能会造成反序列化漏洞。

        原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
        魔术方法利用点分析:
触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct():     //构造函数,当对象 new 的时候会自动调用
__destruct():    //析构函数当对象被销毁时会被自动调用
__wakeup():     //unserialize()时会被自动调用
__invoke():     //当尝试以调用函数的方法调用一个对象时,会被自动调用
__call():     //在对象上下文中调用不可访问的方法时触发
__callStatci():     //在静态上下文中调用不可访问的方法时触发
__get():     //用于从不可访问的属性读取数据
__set():     //用于将数据写入不可访问的属性
__isset():     //在不可访问的属性上调用 isset()或 empty()触发
__unset():     //在不可访问的属性上使用 unset()时触发
__toString():     //把类当作字符串使用时触发
__sleep():     //serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会被优先调用

三、序列化和反序列化演示

<演示一>

1.这里是一段经典的系列化和反序列化的代码。

2.先将后两行注释掉,仅让其输出$s,可以看到其内容如下。

3.下面是对其序列化的内容的解释。

4. 将代码修改成下面的样式。

5.将$u输出出来如下图所示。

6.完整的解释如下图所示。

        总结:就是一种典型的数据传输方法,可以更好的保证代码的正确性和完整性。

<演示二>

1.再来看一段代码。
魔术方法通常就是看其前面有没有两个下划线——“__”

2.我们首先将代码更改成下面的样式。

 3.此时访问可以可到下面的返回结果。

4.这里我们仅仅创建了一个对象,就将下面的两个函数给调用了,从而输出了对应的内容。

        总结:无需函数,创建对象就会调用魔术方法。 

<演示二>

1.再来看一段代码。

 2.执行结果如下图所示。

3.我们将代码更改为下面的样式。

 4.将上面序列化后的代码使用参数上传上去。

 5.网页返回下面的结果。 

6.在代码里我们没有进行创建,但是仍然返回的end,是因为我们上传了序列化的内容,此时默认就进行了调用。

7.将代码再次更改。

8.此时再次执行可以发现test()被触发出来了。

         总结:传递序列化字符串,就相当于默认实现获取对象里的数据,包括调用里面的函数,也就是说即使不去创建对象,也能够触发对象里的变量以及函数,触发过程就是按照魔术方法的触发逻辑,

四、漏洞出现演示

<演示一>

1.打开下面的代码。

2.创建一个对象,会先调用__construct,然后销毁调用__destruct。运行结果如下图所示。

3.更改代码然后执行,将序列化字符串输出出来然后复制。

4.将代码更改成下图样式。

5.将序列化的代码当作参数进行上传,之后可以看到页面内依然返回了ipconfig执行结果。相当于此时没有创建对象,只是输入了序列化字符串,就默认调用了__destruct代码。

<演示二>

1.打开下面的代码。

 2.此时访问后,会先执行__construct,显示“xiaodisec”,然后回执行__destruct,执行系统命令ipconfig。 

3.更改代码然后访问,来获取cc的序列化代码。

4.将代码更改为下面的样式来接收序列化的代码c。

5.将序列化代码c当作参数提交,此时执行了__destruct,没有执行__construct,因为我们这里皆有进行“new”操作。

6.此时我们可以想到更改参数c的内容来执行一些其它的命令,下面进行尝试。

7.将参数里的ipconfig更改为“var”,然后将前面的长度改为“3”,执行后可以得到下面的返回结果,成功执行了“var”命令。

        这里就是序列化漏洞的核心点,前面讲解的所有都是为这一步做准备!

        总结:在反序列化操作里,对象里设置好的一些变量也可以进行修改,这里就是将ipconfig修改成了ver。也就是说,有时只要创建对象,就会调用对象内的魔术方法;或者当类似于unserialize的这种函数出现时,即使没有创建对象,也可以通过控制输入的参数,去让它调用对象里的内容。

        这种漏洞一般出现在白盒里,在黑盒里要想发现几乎是不可能的,因为需要看到源代码对源代码的代码逻辑进行分析后才能分析到是否存在反序列化漏洞。

四、ctfshow靶场真题实操

        靶场地址:ctf.show

<真题一>

1.找到对应题目进入靶场。 

2.打开靶场。

3.进入靶场。

4.分析代码后得到下面的解题思路:

  • 首先触发vipOneKeyGetFlag。
  • 然后让$this->isVip为真即可。

5.继续分析代码:

  • 仅需让username='xxxxxx';password='xxxxxx'即可。 

 6.开始操作。

http://eaece883-4d1b-411b-989d-b09aae68b5df.challenge.ctf.show/?username=xxxxxx&password=xxxxxx

7.成功得到了flag。

<真题二>

1.找到对应题目进入靶场。 

 2.打开靶场。

3.进入靶场。

4.分析代码后可以想到进行下面的操作。

5.将POP链复制下来。

O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

6.打开Hack Firefox访问靶场链接。

7.使用burp抓包。

8.将抓到的数据包发送到Repeater。 

9.根据源代码可以知道它接收的是cookie里的user数据,并且会检测username和password因此对数据包进行下面的修改。

10.放包后可以看到成功获取到了flag。

<真题三>

1.找到对应题目进入靶场。 

 2.打开靶场。

 3.进入靶场。

4.分析代码后可以想到进行下面的操作。

 5.将POP链复制下来。

O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A1%3A%22x%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22y%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

6.打开Hack Firefox访问靶场链接。

7.使用burp抓包。

 8.将抓到的数据包发送到Repeater。 

9.根据源代码可以知道它接收的是cookie里的user数据,并且会检测username和password因此对数据包进行下面的修改,然后放包。

10.可以看到成功获取到了flag。

<真题四>

1.找到对应题目进入靶场。 

 2.打开靶场。

3.进入靶场。

4.这关里可以看到有多个class,因此我们就先要看哪个地方能获取到flag,但是我们并没有找到直接和flag相关的操作,但是我们在下面看到了函数eval。

        补充: eval()函数可以把字符串按照php代码来执行。

5.因为这里只可能eval会与flag相关,所以我们就判断谁会触发eval。

6.可以看到getInfo会触发eval,__destruct会触发getInfo,而__destruct触发时class='info',当将'info'修改成backDoor后就可以调用到eval函数了。

7.复制class代码到在线工具内,然后将无用的代码删除后修改,之后执行。 

O%3A11%3A%22ctfShouUser%22%3A1%3A%7Bs%3A18%3A%22%00ctfShouUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A17%3A%22system%28%22cat+f%2A%22%29%3B%22%3B%7D%7D

8.打开Hack Firefox访问靶场链接。

9.使用burp抓包。

 10.将抓到的数据包发送到Repeater。  

9.对数据包进行下面的修改然后放包,可以得到flag。

10.成功获取到了flag。

相关文章:

WEB攻防-通用漏洞PHP反序列化POP链构造魔术方法原生类

目录 一、序列化和反序列化 二、为什么会出现反序列化漏洞 三、序列化和反序列化演示 <演示一> <演示二> <演示二> 四、漏洞出现演示 <演示一> <演示二> 四、ctfshow靶场真题实操 <真题一> <真题二> <真题三> &l…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK里的图像处理库进行图像转换(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK进行图像转换&#xff08;C&#xff09;Baumer工业相机Baumer工业相机的SDK里图像格式转换的技术背景Baumer工业相机通过BGAPI SDK进行图像转换调用BGAPI SDK的图像转换库ImageProcessor调用BGAPI SDK建立图像调用BGAPI SDK转换图像…...

JD开放平台接口(获得JD商品详情, 按关键字搜索商品,按图搜索京东商品(拍立淘), 获得店铺的所有商品,获取推荐商品列表, 获取购买到的商品订单列表)

参数说明 通用参数说明 url说明 https://api-gw.onebound.cn/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#xff0c; API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,测试key:test_api_keysecret:调用secret,测试secret:(不用填写…...

上海亚商投顾:沪指震荡反弹 游戏、传媒概念股再度大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪大小指数今日走势分化&#xff0c;沪指向上震荡反弹&#xff0c;创业板指一度跌近1%&#xff0c;黄白二线大幅背离。…...

C/C++ 玩转StoneValley库:从入门到精通

C/C 玩转StoneValley库&#xff1a;从入门到精通引言&#xff08;Introduction&#xff09;StoneValley库简介&#xff08;Overview of StoneValley Library&#xff09;为什么要学习StoneValley库&#xff08;Why Learn StoneValley Library in C&#xff09;StoneValley库安装…...

CentOS7-部署Tomcat并运行Jpress

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1、简述静态网页和动态网页的区别 静态网页&#xff1a; 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进…...

菜鸟程序员的3年心酸逆袭之旅!今天你对我爱搭不理,明天我让你高攀不起!

多年前我以一个菜鸟的身份 进入了一家创业公司 我原本以为公司是这样的 但是实际上是这样的 我进去时 我们部门除开部门老大还有我 也只有我 所以我就这样开始了我的程序员生涯 开始了我的苦逼技术 公司是做电商网站的 因为我是一个菜鸟 所以我接到的第一个任务 就是做一个网页…...

【Scala】异常 隐式转换 泛型

目录 异常 隐式转换 隐式函数 隐式参数 隐式类 隐式解析机制 泛型 泛型上下限 上下文限定 来源&#xff1a; 异常 def main(args: Array[String]): Unit {try {var n 10 / 0}catch {case ex: ArithmeticException>{// 发生算术异常println("发生算术异常&quo…...

1673_MIT 6.828 Homework xv6 lazy page allocation要求翻译

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 在计划表中看到了这样一份作业&#xff0c;做一个简单的翻译整理。原来的页面&#xff1a;Homework: xv6 lazy page allocation (mit.edu) 家庭作业&#xff1a;x…...

六、Locust之TaskSets详解

​ TaskSets是一种结构化测试分层网站/系统的方法。你可以在这里阅读更多关于它的信息。 1.TaskSet class ​ 如果你正在对一个以分层方式构建的网站进行性能测试&#xff0c;有章节和子章节&#xff0c;以同样的方式构建你的负载测试可能是有用的。 ​ 为了这个目的&#x…...

flask_知识点3_css

flask_知识点3_css样式1高度和宽度2行内和块级3字体和颜色4文字对齐方式5浮动6 内边距6 外边距&#xff01;css重点1、css样式2、分析页面布局3、参考别人的成果css引用方式1 在标签上&#xff08;不建议使用&#xff09;// An highlighted block var foo bar;2 在head标签中写…...

Redis_概述_特性_IO模型

本章要点 掌握NoSql数据库的概念和与sql数据库的区别初步了解Redis内存数据库了解Redis内存数据库的优点及其原因掌握Redis的多线程IO模型学习Redis的安装和配置 Redis简介 Redis 全称 Remote Dictionary Server 远程字典服务! 使用C语言编写,支持网络,可基于内存也可以持久化…...

[论文速览] Sparks of Artificial General Intelligence: Early experiments with GPT-4

Sparks of Artificial General Intelligence: Early experiments with GPT-4 2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文&#xff0c;总所周知&#xff0c;2023年是通用人工智能&#xff08;Artificial General Intelligence&#xff0c;AGI&a…...

舔狗日记:学姐生日快到了,使用Python把她的照片做成视频当礼物

舔狗日记1前言一、需要调入的模块二、实现合并多张图片转成 mp4 视频三、优化改进一下总结前言 这不是学姐生日快到了&#xff0c;于是我学了一手使用Python来把学姐的照片生成为视频&#xff0c;到时候给她一个惊喜&#xff01; 好了先不舔了&#xff0c;下面分享一下用pytho…...

从《移动互联网应用程序(App)收集使用个人信息自评估指南》看个人信息保护着力点

为指导应用运营者对自身收集、使用个人信息行为进行自查自纠&#xff0c;2019年3月&#xff0c;应用专项治理工作组发布了《应用违法违规收集使用行为自查自查指南》。个人信息”。随着对App违法收集、使用个人信息行为评价工作的开展和深入&#xff0c;《App违法违规收集、使用…...

电脑0x0000001A蓝屏错误怎么U盘重装系统教学

电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug&#xff0c;只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢&#xff1f;来看看以下的详细操作方法教学吧。 准备工作&…...

Day939.如何小步安全地升级数据库框架 -系统重构实战

如何小步安全地升级数据库框架 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何小步安全地升级数据库框架的内容。 当消息组件的数据存储都是采用 SQL 拼写的方式来操作&#xff0c;这样不便于后续的扩展及维护。除此之外&#xff0c;相比前面的其他重构&#x…...

2023 年十大 API 管理趋势

作者郑玩星&#xff0c;API7.ai 技术工程师。 阅读原文 什么是 API&#xff1f;什么是 API 管理&#xff1f; 近期&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;生成式人工智能&#xff09;在各行业的应用日趋普及。AIGC 服务提供商通过 API 向外部提供其内…...

计算机网络微课堂1-3节

目录 1. TCP/TP协议​编辑 2. 3.调制解调器 4.因特网的组成 5.电路交换 6.分组交换 重要常用 7.报文交换 8.总结电路交换 报文交换和分组交换 9. 1. TCP/TP协议 2. ISP 网络提供商 ISP的三层 国际 国家 和本地 3.调制解调器 什么是调制解调器&#xff0c;它存在的…...

[Eigen中文文档] Array类与元素操作

文档总目录 本文目录什么是Array类&#xff1f;Array类型访问Array中的值加法与减法Array乘法其他按元素操作的运算array和matrix表达式之间的转换英文原文(The Array class and coefficient-wise operations) 本页旨在提供有关如何使用Eigen的Array类的概述和说明。 什么是A…...

python学习,全球有哪些特别好的社区推荐呢?

Surfshark可以访问全球社区学习的surfshark工具使用方法教程&#xff1a;qptool.net/shark.html 以下是一些全球范围内比较受欢迎的 Python 学习社区&#xff1a; 中文社区&#xff1a;csdn.net 优势&#xff1a;本土国语社区&#xff0c;获得相关知识与经验便利。 Python官…...

LC-1042. 不邻接植花(四色问题(染色法))

1042. 不邻接植花 难度中等198 有 n 个花园&#xff0c;按从 1 到 n 标记。另有数组 paths &#xff0c;其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中&#xff0c;你打算种下四种花之一。 另外&#xff0c;所有花园 最多 有 3 条路径可以进入…...

python实战应用讲解-【numpy科学计算】scikits-learn模块(附python示例代码)

目录 Numpy 安装scikits-learn 准备工作 具体步骤 Numpy 加载范例数据集 具体步骤...

大数据开发必备面试题Spark篇01

1、Hadoop 和 Spark 的相同点和不同点&#xff1f; Hadoop 底层使用 MapReduce 计算架构&#xff0c;只有 map 和 reduce 两种操作&#xff0c;表达能力比较欠缺&#xff0c;而且在 MR 过程中会重复的读写 hdfs&#xff0c;造成大量的磁盘 io 读写操作&#xff0c;所以适合高时…...

SpringBoot整合xxl-job详细教程

SrpingBoot整合xxl-job&#xff0c;实现任务调度说明调度中心执行器调试整合SpringBoot说明 Xxl-Job是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。Xxl-Job有…...

【MySQL--04】数据类型

文章目录1.数据类型1.1数据类型分类1.2数值类型1.2.1tinyint类型1.2.2bit类型1.2.3小数类型1.2.3.1 float1.2.3.2 decimal1.3字符串类型1.3.1 char1.3.2 varchar1.3.3char和varchar的比较1.4日期和时间类型1.5 enum和set1.5.1 enum1.5.2 set1.5.3 示例1.数据类型 1.1数据类型分…...

git 将其它分支的文件检出到工作区

主要是使用如下命令&#xff1a; git checkout [-f|--ours|--theirs|-m|--conflict<style>] [<tree-ish>] [--] <pathspec>…​覆盖与 pathspec 匹配的文件的内容。当没有给出<tree-ish> (通常是一个commit)时&#xff0c;用 index 中的内容覆盖工作树…...

人工智能的最大危险是什么?

作者&#xff1a;GPT(AI智学习) 链接&#xff1a;https://www.zhihu.com/question/592107303/answer/2966857095 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 首先&#xff1a;人工智能为人类带来了很多益处&…...

rk3568点亮E-ink

rk3568 Android11/12 适配 E-ink “EINK”是英语ElectronicInk的缩写。翻译成中文为“电子墨水”。电子墨水由数百万个微胶囊(Microcapsules)所构成&#xff0c;微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子&#…...

如何将Springboot项目通过IDEA打包成jar包,并且转换成可执行文件

首先在IDEA打开你的项目&#xff0c;需要确认项目可以正常运行&#xff0c;然后点击页面右侧的Maven,运行Lifecycle下的package, 此时在项目的target目录下就可以看到一个jar包 这个时候你可以在jar包所在目录下执行cmd窗口&#xff0c;运行 java -jar campus-market-0.0.1-S…...