当前位置:网站首页>[网鼎杯 2020 青龙组]AreUSerialz
[网鼎杯 2020 青龙组]AreUSerialz
2022-07-30 05:41:00 【挽风129】
打开靶场链接可以看到给出的代码

代码审计,分析得到这个题目需要传入一个序列化之后的类对象

基本就是对输入的字符进行了一点过滤,然后进行反序列化。
然后,再分析类中的部分。去掉了__construct(),因为它在unserialize()时是不会自动调用的。反序列化会先调用__destruct()这个魔术方法,先从它开始分析。而且我们的目标是读取它包含的flag.php文件。

从这里我们可以分析出这串代码对op进行了过滤,如果你op等于2,就会被强制性转换为1再输出,最后的值给到process
我们再看process代码

从这里我们可以看到op值等于1输出write,op值等于2则输出read,
所以我们要读取的flag,所以要op等于2
总结:我们要绕过__destruct()这个魔术方法的过滤,op值对比 === 类型 值
我们可以使用op=’ 2’,加一个空格绕过。
来到read代码

我们可以看到变量filename,我们查看的是file.php这个文件,所以我们要读取这个文件把filename=file.php就行
因为开头代码已经给出了三个变量,所以我们构造的序列化代码是

这里解释下为什么用public而不是protected,因为我们绕过那里写了空格,protected在序列化会有%00符号,而public则不会有,所以用public。变量$content可以随意给个值。
把这个代码序列化

得到O:11:"FileHandler":3:{s:2:"op";s:2:" 2";s:8:"filename";s:8:"flag.php";s:7:"content";s:2:"ly";}
回到题目的页面输入?str=O:11:"FileHandler":3:{s:2:"op";s:2:"
2";s:8:"filename";s:8:"flag.php";s:7:"content";s:2:"ly";}
![]()
回车,按F12查看,得到flag

PHP反序列化
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象

首先我们要了解php反序化的魔术方法
构造函数和析构函数
- __construct()
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。 - __destruct()
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
new出一个新的对象时就会调用__construct(),而对象被销毁时,例如程序退出时,就会调用__destruct()
涉及:反序列化魔术方法调用,弱类型绕过,ascii绕过
使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。
__destruct函数对$this->op进行了===判断并内容在2字符串时会赋值为1,
process函数中使用==对$this->op进行判断(为2的情况下才能读取内容),
因此这里存在弱类型比较,可以使用数字2或字符串' 2'绕过判断。
is_valid函数还对序列化字符串进行了校验,因为成员被protected修饰,
因此序列化字符串中会出现ascii为0的字符。经过测试,在PHP7.2+的环境中,
使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。
边栏推荐
- numpy中np.inf函数的用法讲解
- 50道SQL练习题(刷完直接进大厂)
- Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
- 每日练习------输出一个整数的二进制数、八进制数、十六进制数。
- 技术人该访问的论坛
- 条件变量解决生产者消费者问题
- P3 元宝第六单元笔记
- MySQL Soul 16 Questions, how many questions can you last?
- Ranking of grades (Huazhong University of Science and Technology postgraduate examination questions) (DAY 87)
- 你怎么看待scanf()中%d的“吃空白”行为?
猜你喜欢

中间件cors三行代码解决跨域问题GET,POST跨域访问解决

Navicat cannot connect to mysql super detailed processing method

卷王的第一篇博客——编程学习的规划

50道SQL练习题(刷完直接进大厂)

社区版idea 最右侧没有Database怎么办

在弹性布局flex布局中,行内标签也能直接加宽高

MySQL Soul 16 Questions, how many questions can you last?

mysql time field is set to current time by default

猜数字小游戏(随机生成’三剑客‘)

Application Practice | Application Practice of Apache Doris in Baidu Intelligent Cloud Billing System
随机推荐
MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
三子棋游戏——C语言
中间件cors三行代码解决跨域问题GET,POST跨域访问解决
Difference between cookie and session
384.打乱数组
646.最长数对链(动态规划)
torch.load()
create-nuxt-app创建出来的项目没有server
MongoDB快速入门与基本使用
50道SQL练习题(刷完直接进大厂)
C语言(1)
函数(c语言)
信号量解决生产者消费者问题
Record Breaker (Google Kickstart2020 Round D Problem A)
数据操作 / 数据预处理
每日练习------输出一个整数的二进制数、八进制数、十六进制数。
ClickHouse data insert, update and delete operations SQL
mysql间隙锁失效?
MySQL Soul 16 Questions, how many questions can you last?
String类型字符串获取第一次或者最后一次出现的下标