CVE-2024-56145 Craft CMS 变量覆盖导致 Twig SSTI 漏洞
CVE-2024-56145 Craft CMS 变量覆盖导致 Twig SSTI 漏洞
原创 KCyber 自在安全 2025-02-25 01:21
漏洞信息
Craft CMS 是一个灵活、用户友好的内容管理系统,用于创建自定义的数字化网络体验等。CVE-2024-56145 中,若开启了 register_argc_argv ,那么攻击者可构造恶意请求利用模版注入漏洞实现 RCE 。影响版本:
-
5.0.0-RC1 <= Craft CMS < 5.5.2
-
4.0.0-RC1 <= Craft CMS < 4.13.2
漏洞分析
安装完系统后,需要开启 register_argc_argv :
Craft CMS 在处理请求中会加载 vendor/craftcms/cms/bootstrap/bootstrap.php 文件,通过 findConfig 函数依次读取多个环境变量,包括 vendorPath/basePath/dotenvPath 等:
从命名来看,代码主要是想通过 cli 方式完成参数赋值,查看 App::cliOption 定义,参数值来自于 $_SERVER[‘argv’] :
如果 register_argc_argv 取值为 On ,那么除了 cli 之外,还可以通过 web 请求来赋值。比如设置 –testsPath=test ,将 $testsPath 变量赋值为 test :
GET /?--testsPath=test HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
很明显这里存在变量覆盖的风险。注意到其中一个参数名为 templatesPath ,猜测和模板路径有关,因为 Craft CMS 集成了 Twig 模板,所以可以尝试通过覆盖模板内容来实现 SSTI 。Twig SSTI 漏洞其他的分析文章可以参考:CVE-2022-2073 Grav CMS Twig SSTI RCE 漏洞及最新版补丁绕过
。
GET /?--templatesPath=test HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Craft::setAlias 函数可以将模板路径进行覆盖,在 \craft\web\View::_resolveTemplate 中调用 is_file 来判断模板文件是否存在,如果不存在最终将返回 404 :
is_file 支持 ftp 协议,因此可以构造一个远程恶意 ftp 服务,让其加载 index.html ,其内容为 Test:{{11*11}}
(通过调试分析发现, /default/index.html 和 /default/index.twig 也可以被使用 )。SSTI 模板注入验证如下:
RCE
下面需要尝试实现 RCE 。通过分析发现,虽然\craft\web\twig\Extension::checkArrowFunction 中设置了黑名单检查,但是很容易利用 call_user_func 等进行绕过:
RCE 效果如下:
需要注意的是, Twig 在进行模板渲染时存在缓存,因此打一次后,再更换模板内容是不能立刻生效的。
在 php 中如果 register_argc_argv 设置为 On 是非常危险的行为,但是很多 docker 环境中默认该选项的值就是 On 。当开启 register_argc_argv 时,可覆盖 $_SERVER[‘argv’] 的取值,可能造成 RCE ,比如 LFI 漏洞下结合 pearcmd 来实现 getshell ,而该漏洞中 register_argc_argv 开启时可以覆盖 templatesPath 模板文件路径,最终利用 SSTI 实现 RCE 。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,公众号及文章作者不为此承担任何责任。