File Upload(文件上传漏洞)
漏洞产生原因:用户上传文件时,在后台并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段来绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过该恶意文件的访问来控制整个web后台。
文件上传漏洞测试流程:
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
- 尝试上传把不同类型的 “恶意” 文件,比如xx.php文件,分析结果
- 查看html源码,看是否通过js在前端做了上传限制,可以绕过
- 尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等
- 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。
1. client check
-
随意上传一个文件。
最好是上传一个网页不允许的文件类型,这样可以看出是如何对上传文件进行限制的。这里上传了一个php文件。
网页弹窗提示文件不符合要求,因此文件上传的限制有可能是在前端。 -
因此我们打开网页控制台,并找到按钮的html代码。
然后发现上传按钮中存在一个函数checkFileExt,我们打开网页源代码,分析该函数的作用。
发现该函数就是限制上传文件的后缀名的一个函数,如果满足后缀名为jpg、png、gif的文件可以上传,不满足则弹窗。 -
修改网页前端代码,将该限制去除。
-
上传一个一句话木马文件system.php
文件内容:
<?php system($_GET['x']);?>
文件上传成功,并且返回了该一句话木马文件的路径。
- 更改浏览器的url,给x传参,即可进行攻击。
2. MIME type
MIME介绍:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
具体介绍:MIME详解
MIME 类型通用结构:
type/subtype
MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 / 分隔而组成,不允许有空格。type 表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。
例如:
超文本标记语言文本 .html、.html:text/html
普通文本 .txt: text/plain
RTF 文本 .rtf: application/rtf
GIF 图形 .gif: image/gif
JPEG 图形 .jpeg、.jpg: image/jpeg
au 声音文件 .au: audio/basic
MIDI 音乐文件 mid、.midi: audio/midi、audio/x-midi
RealAudio 音乐文件 .ra、.ram: audio/x-pn-realaudio
MPEG 文件 .mpg、.mpeg: video/mpeg
AVI 文件 .avi: video/x-msvideo
GZIP 文件 .gz: application/x-gzip
TAR 文件 .tar: application/x-tar
$_FILES()函数介绍:通过使用PHP的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数为表单的input name,第二个参数可以是“name”,“type”,“size”,“tmp_name”,“error”。
例如:
该种情况的漏洞在于:后台使用了$_FILES数组获取type来进行文件类型的比对。而$_FILES数组获取type是从前端的content-type中获取的,因此我们可以抓包并修改该字段,从而绕过后端的检查。
-
上传一句话木马文件。
发现后端只接受jpg、jpeg、png类型的文件。 -
使用burpsuite进行抓包。
由于$_FILES数组获取type是从前端的content-type中获取的,因此我们可以抓包并修改该字段,从而绕过后端的检查。修改content-type为
image/png
这样一来就能上传成功了。
-
修改url进行攻击即可。
3. getimagesize
getimagesize介绍:Getimagesize()是PHP用来判断目标文件是否为一个图片的函数,通过读取该16进制文件的前几个字符,看是否符合图片的要求(因为相同格式的图片的前几个字符都是一致的)。返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否为图片的话,会存在问题。
如何绕过:伪造图片前几个字符
图片木马的制作:
方法1: 直接伪造头部GIF89A
方法2: CMD:copy /b test.png + muma.php cccc.png (格式:copy /b 正常图片 + 木马 新生成的图片)
方法3:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令。
-
制造一个图片木马。
打开cmd,使用命令:
copy /b kb.png + system.php ccc.png
注意其中kb.png为正常图片,system.php为木马文件,ccc.png为新生成的图片木马。
-
在网页中上传该图片木马。
-
进行攻击。
将木马图片上传成功后,我们可以利用文件包含漏洞进行利用。
url为:http://127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/08/21/4420386302054d07c77924137639.png&submit=%E6%8F%90%E4%BA%A4?x=ipconfig
漏洞利用成功,但是返回的是乱码,这里主要是为了讲解原理。
总结
防范措施:
- 不要在前端使用js实施上传限制策略
- 通过服务器端对上传文件进行限制:
- 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性等,不要仅仅检查后缀。
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则),这样即使攻击者传上来木马文件,也无法找到其路径进行利用
- 对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害