近期在某平台上监控了一些POC之类的,后续发现了一个公开的POC,所以根据这个POC去尝试了一下复现,分别也针对这个漏洞问题进行了分析,这个盘的源码都是网上下载的搭起来用的,站的源码都还带着广告!对于经常搞这些的朋友们,肯定觉得无所谓,所谓就是开单吃一年,不开单饿死!
一、WebUploader组件
WebUploader属于一个比较老的组件,该组件在19年的时候是出现过文件上传的漏洞问题,像类似文件上传组件几乎都存在一定的过滤不严的问题,那么今天我们先简单了解/webuploader这个组件文件上传的漏洞!
找到组件源码后,我们简单的给它过一遍吧,既然有源码就少不了流程,seay审计工具跑一遍!
在漏洞详细也是截图的右列我们也看到扫描出来的,可能存在:文件操作函数中存在变量,可能存在任意文件读取/删除/修改/写入等漏洞,你在看的同时你也会发现/webuploader-master/server/preview.php中的file_put_contents($filePath, $data);函数代码串是和其它的代码函数都非常的特别。
我们先来了解这个PHP函数,在PHP官方提供了一个很方便的函数叫做file_put_contents()
来帮助我们做这件事情。它的用法很简单,你只需要告诉它要保存的文件名和要写入的内容,它就会帮你把内容写入文件里。
语法:file_put_contents(string $filename, mixed $data, int $flags = 0, resource $context = null): int|false
$filename
:要写入的目标文件名或路径。$data
:要写入的数据,可以是字符串、数组或者其他可写入的数据类型。$flags
:可选参数,用于指定写入数据时的行为选项,比如追加到文件末尾等。$context
:可选参数,通常用于传递文件处理的上下文资源。
这里来一个正常栗子:
$data = "Hello, world!";
$filename = "example.txt";// 将数据写入文件
$result = file_put_contents($filename, $data);if ($result !== false) {
echo "数据成功写入文件";
} else {
echo "写入文件失败";
}
在这个例子中,我们把字符串"Hello, world!"
写入到了名为example.txt
的文件中。如果写入成功,file_put_contents()
函数会返回写入文件的字节数。如果写入失败,它会返回false
。
这里来一个使用不当的栗子(涉及文件路径注入漏洞):
$data = "Hello, world!";
$filename = $_GET['filename']; // 从用户输入获取文件名// 将数据写入文件
$result = file_put_contents($filename, $data);if ($result !== false) {
echo "数据成功写入文件";
} else {
echo "写入文件失败";
}
在这个例子中,程序从用户的输入$_GET['filename']
获取文件名,然后直接传递给file_put_contents()
函数。如果攻击者能够控制filename
参数,并且传入一个恶意的文件路径,就可能导致文件路径注入漏洞的发生。例如,攻击者可以将文件名设置为../../../etc/passwd
,从而尝试读取系统的密码文件。
二、preview.php文件分析
通过第一章节,我们已经了解过漏洞的主要的一些风险函数,接下来我们分析整个/webuploader-master/server/preview.php文件,其实整个文件也是特别的容易上手,先看整体代码片段,先让自己有个底和感觉。首先,这个文件上传漏洞用的是什么方法进行上传?又怎么绕过?
<?php
/**
* 此页面用来协助 IE6/7 预览图片,因为 IE 6/7 不支持 base64
*/#!! 注意
#!! 此文件只是个示例,不要用于真正的产品之中。
#!! 不保证代码安全性。
#!! IMPORTANT:
#!! this file is just an example, it doesn't incorporate any security checks and
#!! is not recommended t