文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于php----phar伪协议和phar文件反序列化漏洞利用

2023-09-01 07:10

关注

Secarma的安全研究员Sam Thomas发现了php里一种新的反序列化漏洞,这种漏洞的利用可以避开传统的php反序列化漏洞的查找,旧漏洞莫非寻找反序列化链(pop链),如thinkphp、Laravel的反序列化链的漏洞和使用phar://伪协议完成反序列化漏洞。新发现的漏洞通过创建phar文件,以及配合phar伪协议进而实现反序列化拿到敏感信息。

phar(php archive)含义为php 归档文件。如果一个由多个文件构成的php应用程序,可以合并打包为一个文件夹,类似于javaweb项目里的jar文件的话,对于程序员来说是很方便的。在PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。要生成phar文件的话也是很方便,不需要借助额外的工具来创建或者使用,通过php脚本运行就自动在该脚本所在目录下自动创建。

在本地找到php的配置文件php.ini,修改;phar.readonly=On

phar.readonly=off

phar存储的meta-data信息以序列化方式存储,当文件操作函数通过phar://伪协议解析phar文件时就会将数据反序列化,可以通过此漏洞利用的函数:

 

phar文件可以上传到服务器

有例如file_get_contents(),file(),include等文件操作函数

:、/、phar等重要参数没有被过滤

首先测试phar伪协议是怎么利用的,往下看:

在本地创建一个php脚本,用来生成.phar文件,名为1.php脚本如下:

startBuffering();    $phar->setStub(""); //设置stub    $o = new TestObject();    $o -> data='N1Xx';    $phar->setMetadata($o); //将自定义的meta-data存入manifest    $phar->addFromString("1.txt", "nlxx"); //添加要压缩的文件    //签名自动计算    $phar->stopBuffering();?>

执行后会在该脚本所在目录,也就是本地根目录生成phar.phar文件:

 

 

接着创建一个测试脚本2.php,内容如下:

 data;       }}include('phar://phar.phar');?>

访问http://127.0.0.1//2.php

分析:

对1.php

在1.php里A类里面其实是没有内容的,所以无法将实例化的对象$obj序列化字符串写入meta-data并存入manifest,但自定义$o -> data='N1Xx';所以将N1Xx存入phar.phar文件中。值得注意的是没有定义$phar->addFromString,相当于没有添加要压缩的文件。

对2.php

在2.php里 echo $this -> data; 输出A类的data变量,即"N1Xx"

但由于1.php没有定义压缩文件,所以这里使用include('phar://phar.phar');文件包含,若使用file_get_contents('phar://phar.phar');会报错:

所以只有当添加有压缩文件时,使用file_get_contents才不会报错。为验证上述问题,接着在1.php里添加压缩文件1.txt,并写入nlxx

 

修改2.php:

再访问http://127.0.0.1/2.php

 

测试成功,,所以要注意include和file_get_contents两者的使用。

下面测试phar伪协议和.phar文件反序列化结合使用:

新建一个3.php,内容如下:

startBuffering();$phar->setStub(""); //设置stub$obj=new B();$phar->setMetadata($obj);//自定义的meta-data存入manifest$phar->addFromString("1.txt","nlxx");//添加要压缩的文件//签名自动计算$phar->stopBuffering();?>

在类B里添加了name变量,并赋值为phpinfo(),并添加了压缩文件

新建测试类4.php:

分析:

file_get_contents()文件包含漏洞使用了phar://伪协议,将meta-data中保存的序列化字符串转化成对象,对象在关闭所有引用之后调用了析构函数__destruct(),eval()执行了变量$name的值,而它的值是phpinfo();

将生成的test.phar拖入010查看:

 

验证了上述序列化字符串被写入meta-data并存入manifest,即存入test.phar文件中。

访问http://127.0.0.1/4.php

 

可知,压缩文件1.txt的内容打印输出,phpinfo()也被执行。

因为一些网站限制了文件上传的格式,例如只能上传PNG、jpg等图片格式,单单上传.phar文件会被过滤导致上传失败。所以可以通过添加任意的文件头+修改后缀名的方式将phar文件伪装成其他格式的文件。

修改3.php里$phar->setStub("");$phar->setStub('GIF89a'.'');

将生成的.phar文件放进cmder,使用file命令查看是什么类型:

 

由此可得到把.phar文件伪装成GIF类型的文件,这样就可以绕过某些网站的限制,成功上传文件。  

 

来源地址:https://blog.csdn.net/m0_62107966/article/details/126824889

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯