专业软件下载站,为您提供无病毒无木马的纯净绿色软件

下载排行榜

教程信息

利用PHAR协议进行PHP反序列化攻击

发布时间:2021-06-29
PHAR ( "Php ARchive" ) 是 PHP 中的打包文件,相当于 Java 中的 JAR 文件,在 php5.3 或者更高的版本中默认开启。PHAR 文件缺省状态是只读的,当我们要创建一个 Phar 文件需要修改 php.ini 中的 phar.readonly,修改为:phar.readonly = 0
 
当通过 phar:// 协议对 phar 文件进行文件操作时,将会对 phar 文件中的 Meta-data 进行反序列化操作,可能造成一些反序列化漏洞。
 
本文由锦行科技的安全研究团队提供,从攻击者的角度展示了 PHAR 反序列化攻击的原理和过程。
 
PHAR 文件结构
 
stub phar:文件标识,格式为 xxx
 
manifest:压缩文件的属性等信息,其中的 Meta-data 会以序列化的形式存储。
 
利用PHAR协议进行PHP反序列化攻击
contents:压缩文件的内容
 
signature:签名,放在文件末尾
 
生成 PHAR 文件
 
生成程序如下:
利用PHAR协议进行PHP反序列化攻击
 
生成 phar 文件,使用 16 进制工具查看,可以看到 Meta-data 中的序列化对象
 
利用PHAR协议进行PHP反序列化攻击
测试反序列化
 
测试程序如下:
 
利用PHAR协议进行PHP反序列化攻击
运行结果,可以看到打印了‘ test ’,证明对象被反序列化创建后销毁。
 
虽然在创建 PHAR 文件时后缀是固定的,但完成创建后我们是可以修改 phar 的后缀名的,例如修改成 .jpg,当执行 include ( 'phar://phar.jpg' ) ; 时也可触发反序列化。
 
几乎所有文件操作函数都可触发 phar 反序列化
 
利用PHAR协议进行PHP反序列化攻击
CTF 演示
 
题目地址: [ CISCN2019 华北赛区 Day1 Web1 ] Dropbox(链接:https://buuoj.cn/challenges#%5BCISCN2019%20%E5%8D%8E%E5%8C%97%E8%B5%9B%E5%8C%BA%20Day1%20Web1%5DDropbox)
 
进入题目后,随意注册账号上传文件,上传点只能上传图片后缀
 
利用PHAR协议进行PHP反序列化攻击
点击下载,有任意文件读取,但是不能读取 flag.txt
 
 
于是读取网页源码,传入 filename=../../xxx.php
 
detele.php
 
 
class.php
 
分析源代码
 
可以看到删除文件时使用了 File 类的 delete 函数,File 类的 delete 使用了 unlink 函数,可以触发 phar 反序列化。
 
继续看到 class.php 的 File 类的 close ( ) 函数中调用了 file_get_contents 函数,可以读取文件。但是要怎么触发呢,我们可以看到 FileList 的 __call 函数,如果我们可以让 FileList 参数 files 为数组且数组中一个类为 File,只要有类可以执行 $FileList->close ( ) ,就可以读取文件并在 FileList 的析构函数中显示出来了。我们看到 User 类的析构函数,执行了 $db->close ( ) 。so,我们让 User 的 $db 参数等于 FileList 就行了。
 
利用链:User 类的 $db 赋值为 FileList 类,User 类的析构函数执行 close 方法 ->触发 FileList 的 __call 函数,让 $file 值为 File,执行 $file 的 close 函数 ->File 执行 close 读取文件,控制 $filename 为想读取的文件 ->FileList 对象销毁,执行析构函数,回显结果。
 
生成 phar 文件代码:
 
 
生成 phar 文件,修改后缀为 jpg,上传
 
删除文件处修改 filename 为‘ phar://phar.jpg ’ , 读取到 flag 文件
利用PHAR协议进行PHP反序列化攻击
本文链接地址: http://www.i6879.com/ddjc/ctjc/32466.html