fumo_backdoor复现
知识点
php代码审计,phpsession反序列化利用
Imgaick类
(vid:msl与mvg协议)
msl语法基础
vid特性
3 msl脚本标签
.
这题用到了上面的base64解密,据博客所说还可以直接使用inline:data:text/8BIM;base64实现不符合PPM协议的数据写入
源码
接受两个参数,cmd可以实现清除/tmp目录与反序列化。
data构造的链子很简单,__sleep绕过waf后可以实现任意文件读取可以无法触发(需要序列化),__wakeup存在new $class($argv),想到原生类,这里利用了Imagick类
解题
三个利用点:需要触发sleep魔术方法来读取文件,同时wakeup会导致无参rce(并不可以直接利用)以及原生类利用(这里用到imagick)
利用imgick漏洞将flag移动到/tmp目录之后
将一段恶意数据设置到/tmp/sessxxx目录下,path设置在flag相应目录
利用vid:msl:/tmp/php*上传上面的数据到/tmp/sess_user中
触发phpsess反序列化来调用wakeup
0
清空tmp目录
1
创建一个写入了脏数据的PPM图片,末尾是复制之后的flag路径,最终用来触发readfile函数
https://github.com/ImageMagick/ImageMagick/blob/main/www/formats.html
(PPM图片允许末尾写入脏数据并且不被imagic忽略)
则在末尾写入数据,重要的是数据的大小要符合PPM要求
2
触发wakeup魔术方法利用imagick把上面的图片存入sess_user中
将上面的图片数据修改为对应格式
本身是想用postman上传的,但是没找着发包的内容导致检查不了,就直接用bp发包了
3
imagick的mvg协议将flag复制到res中
4
启动session传入PHPSESSION反序列化sess_user来触发__sleep方法
最后发包就应该能获取flag的,这里可能本地环境有点问题....复现的大佬也说有时候要多试几次,我这边一直没出![截图](93b0dda5e3dba6abe80ceccaf4d888b3.png)
5
最后整理一下漏洞触发的流程
当我们开启session并且访问对应的php_user文件时会将他的内容反序列化,
这个文件是先前被攻击者利用imagick恶意写入的,因此存在脏数据(反序列化时会访问/tmp/xxx文件)
并且攻击者已经利用imagick协议将flag写入到/tmp/xxx文件中