首页 » 网站建设 » viewphp破绽技巧_Laravel Debug模式下远程代码实行马脚分析​

viewphp破绽技巧_Laravel Debug模式下远程代码实行马脚分析​

访客 2024-11-23 0

扫一扫用手机浏览

文章目录 [+]

2021年1月13日,百度云安全团队监测到有国外安全研究职员表露了Laravel远程代码实行漏洞详情,当Laravel<=8.4.2、ignition组件版本<=2.5.1并且开启了Debug模式情形下,攻击者可通过php://filter布局特定的日志文件,并触发Phar反序列化导致任意代码实行漏洞,漏洞危害较大,建议及时升级Laravel以及ignition组件到最新版本。

2、漏洞环境搭建

viewphp破绽技巧_Laravel Debug模式下远程代码实行马脚分析​

git clone https://github.com/laravel/laravel.git #下载laravel源码

viewphp破绽技巧_Laravel Debug模式下远程代码实行马脚分析​
(图片来自网络侵删)

cd laravel

git checkout -b e849812 #切换到存在漏洞的分支

composer install #composer安装依赖

composer require facade/ignition==2.5.1 #下载存在漏洞版本组件

安装好后在根目录实行 mv .env.example .env,.env.example中默认设置了APP_DEBUG=true,此时启动apache2做事器即可。

为了复现原作者所述当变量未定义时涌现的报错情形,须要在resource/views/ hello.blade.php中设置一个大略的模板。

并在routes/web.php中添加路由

访问/public/index.php/hello即涌现变量未定义的报错信息。

3、漏洞剖析

点击Make variable optionl并抓包,要求的接口为/_ignition/execute-solution

通过搜索路由,对应的处理类为ExecuteSolutionController,由于此处类工具被当做函数调用,因此会调用ExecuteSolutionController类的__invoke方法。

在__invoke中,先调用ExecuteSolutionRequest->getRunnableSolution()获取solution工具,随后调用solution工具的run方法。

但此时须要知道solution工具对应的类,因此跟进到getRunnableSolution方法,创造solution工具来自getSolution方法的返回,并且必须是RunnableSolution类的实例,也便是说solution工具的类必须是RunnableSolution类的子类。
跟进getSolution方法,创造类来源于通报的solution参数,而solution的值为Facade\Ignition\Solutions\MakeView VariableOptionalSolution恰好继续于RunableSolution接口,知足上述条件。

跟进到MakeViewVariableOptionalSolution的run方法,可以看到$parameters参数被通报到makeOptional参数处理,并且viewFile参数对应的文件会被file_get_contents方法读取,并将$username更换为$username ? ‘’,并且由于后续会做Token化比对,因此没办法直接通过掌握variableName参数做一些打破。

但由于viewFile可控,并且会经由file_get_contents方法处理,如果能够上传或者写入Phar文件,是可以利用phar://实现反序列化的。
而此时我们唯一可控部分内容的文件是laravel的日志文件,默认目录是storage/logs/laravel.log。

此时就算能掌握一部分日志内容,但可控内容前后有日期、堆栈信息等太多不可控内容,没办法直接写入Phar文件。
这时候,漏洞原作者奥妙的利用了php://filter伪协议,该协议能够灵巧地对文件内容进行多种编解码。

利用base64解码能够在有一部分滋扰内容情形下仍旧解码成功,但如果有=等字符则可滋扰正常解码。
此时作者想到了利用convert.iconv.utf-16le.utf-8,可以将其他滋扰内容转换成非ascii,而非ascii字符再经由base64解码即可变成空。
但utf-16le编码中会有一些空字符,通报到file_get_contents方法中会报错。
因此还须要利用convert.quoted-printable-encode可以将空字符编码为=00,再利用与之相对的decode方法即可办理这个问题。

因此整体的调用链条如下:

ExecuteSolutionController->__invoke()

->ExecuteSolutionRequest->getRunnableSolution()->getSolution()

->MakeViewVariableOptionalSolution->run()

4、漏洞利用

在理解上述事理后,想要利用该漏洞须要有几个步骤:

1)清空laravel.log

设置viewfile=php://filter/write=convert.base64-decode|convert.base64-decode|convert.base6 4-decode/resource=/var/www/html/laravel/storage/logs/laravel.log

并多实行几次,利用base64解码失落败输出为空的特性将日志置空。

2)向日志中插入特定的Payload

利用phpggc项目选择特定的反序列化链条天生Payload,并根据上述剖析做三重对应的编码。

3)日志内容解码

利用convert.quoted-printable-decode、convert.iconv.utf-16le.utf-8、convert.base64-decode三种办法解码,确保日志中仅存Phar文件。

4)触发Phar反序列化

当Phar文件被部分文件系统函数处理时触发反序列化,此处利用Larvavel特定依赖monolog的反序列化利用链实现任意代码实行。

5、安全产品办理方案

百度度御关WAF、高等威胁感知系统,以及智能威胁佃猎平台已支持该漏洞的检测和拦截,有须要的用户可以访问anquan.baidu.com联系我们。

参考:

https://www.ambionics.io/blog/laravel-debug-rce

标签:

相关文章

今日头条算法如何打造个化推荐系统

信息爆炸的时代已经到来。人们每天都要面对海量的信息,如何在海量信息中找到自己感兴趣的内容,成为了许多人关注的焦点。今日头条作为一款...

网站建设 2025-01-31 阅读1 评论0