Laravel_5.4.0_9.3.6+_反序列化链_RCE1

根据 PHPGGC 中的 Laravel/RCE7 或者 Laravel/RCE9而写出来的,全版本通杀

这是 Laravel 反序列化链系列的第六篇文章

0x00 漏洞环境

https://github.com/N0puple/php-unserialize-lib

进入对应的文件夹执行如下命令启动环境:

docker-compose up -d

访问 http://x.x.x.x/index.php/test ,看到 hello world 既搭建成功

测试代码


namespace App\Http\Controllers;

class TestController extends Controller
{
	public function index()
	{
		if(isset($_GET['a']))
		{
			unserialize(base64_decode($_GET['a']));
		}
		else
		{
			echo "hello world";
		}
	}
}

0x01 漏洞影响

5.4.0 <= x <= 9.3.6+

0x02 漏洞分析

使用 laravel 最常见的入口 src/Illuminate/Broadcasting/PendingBroadcast.php::__destruct()

Laravel_5.4.0_9.3.6+_反序列化链_RCE1_第1张图片

$this->events$this->event 可控,找某个类的 dispatch 方法,这里找到 src/Illuminate/Bus/Dispatcher.php::dispatch($command)

Laravel_5.4.0_9.3.6+_反序列化链_RCE1_第2张图片

$this->queueResolver$command 可控,我们进入 $this->commandShouldBeQueued($command) ,查看代码

protected function commandShouldBeQueued($command)
{
    return $command instanceof ShouldQueue;
}

因此需要传进来的 $commandShouldQueue 的实例,而 ShouldQueue 是一个接口,因此只要是实现此接口的类的实例即可

Laravel_5.4.0_9.3.6+_反序列化链_RCE1_第3张图片

如上的都可以,此处选取 BroadcastEvent 类,然后进入 $this->dispatchToQueue 方法

Laravel_5.4.0_9.3.6+_反序列化链_RCE1_第4张图片

$connection$command->connection ,而 $commandBroadcastEvent 的实例,因此 $connection 可通过设置一个 connection 值来控制,而 $this->queueResolver 也是可控的,因此可以直接命令执行

0x03 漏洞复现

通过 exp.php 生成 payload ,然后直接打

Laravel_5.4.0_9.3.6+_反序列化链_RCE1_第5张图片

0x04 链接

环境与 exp 都可以在如下链接获取

GitHub

https://github.com/N0puple/php-unserialize-lib

GitBook:

https://n0puple.gitbook.io/php-unserialize-lib/

你可能感兴趣的:(PHP反序列化链,Laravel,漏洞分析,laravel,php,安全,漏洞复现,任意代码执行)