0x00 漏洞环境
https://github.com/N0puple/php-unserialize-lib
进入对应的文件夹执行如下命令启动环境:
docker-compose up -d
访问 http://x.x.x.x/index.php/test ,看到 hello world
既搭建成功
测试代码
<?php
namespace AppHttpControllers;
class TestController extends Controller
{
public function index()
{
if(isset($_GET['a']))
{
unserialize(base64_decode($_GET['a']));
}
else
{
echo "hello world";
}
}
}
0x01 漏洞影响
5.5.0 <= 5.8.35
0x02 漏洞分析
首先来找起点,一般就是 __destruct
或者 __wakeup
,这里使用 laravel
最常见的入口 src/Illuminate/Broadcasting/PendingBroadcast.php::__destruct()
$this->events
与 $this->event
可控,因此我们可以找 __call
方法,并且要求可以执行命令
这里找到的是 src/Illuminate/Support/Manager.php
中的 Manager
抽象类,看这里的 __call
方法
public function __call($method, $parameters)
{
return $this->driver()->$method(...$parameters);
}
$this->driver()
执行后的返回值,指向 $method
,这里会执行 $method
方法,而 $method
值传进来的是 dispatch
,那么我们要像 Laravel_5.4.0_8.6.9_反序列化链_RCE1 中一样,找可以命令执行的 dispatch
方法?当然不是,那写这条链子就没有意义了,这里我们可以跟进 $this->driver()
跟进 getDefaultDriver
方法,而这个方法为抽象方法,那我们必须找一个实现 Manager
类的其他类,这里找到的是 src/Illuminate/Notifications/ChannelManager.php
的 ChannelManager
类,他的 getDefaultDriver
方法实现如下
public function getDefaultDriver()
{
return $this->defaultChannel;
}
因此这里可以很简单地控制 $driver
的值,接着往下看,$this->drivers
可控,我们直接跟进 ChannelManager
类的 createDriver
方法,参数可控,直接返回了 parent::createDriver($driver);
,因此是进入 Manager
类的 createDriver
方法
$this->customCreators
可控,因此直接进入 $this->callCustomCreator($driver);
,并且参数也是传进来的,也可控
protected function callCustomCreator($driver)
{
return $this->customCreators[$driver]($this->app);
}
到了这里就简单了,就是一个 $a($b)
的形式,而且 $a
与 $b
都可控,直接可以命令执行
0x03 漏洞复现
通过 exp.php
生成 payload
,然后直接打,查看源码可以看到命令执行结果
0x04 链接
环境与 exp
都可以在如下链接获取
GitHub
https://github.com/N0puple/php-unserialize-lib
GitBook:
https://n0puple.gitbook.io/php-unserialize-lib/
公众号
公众号搜索:安全漏洞复现
扫码持续关注:
原文始发于微信公众号(安全漏洞复现):Laravel_5.5.0_5.8.35_反序列化链_RCE1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论