Pikachu-Unsafe Fileuplode(不安全文件上传)
一、不安全的文件上传漏洞概述:
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
1、验证文件类型、后缀名、大小;
2、验证文件的上传方式;
3、对文件进行一定复杂的重命名;
4、不要暴露文件上传后的路径;
二、Unsafe Fileupload-client check (不安全的文件上传-客户端验证)
看到界面,我们看到提示说:只能上传照片。
我们这个时候刻意去看看后台的源码,加深一下了解:
我们看到,当传输文件时,会调用下面这个updown函数
而且,对上传文件的类型也有限制:jpg png gif
那怎么办呐?这是我们上传文件木马肯定传不上去,但是我们要是把网页的源码进行修改,破坏其检测流程,是不是就可以轻易的写入木马,然后就是中国菜刀获取shell权限,完美!
漏洞实验:
按照图片的提示寻找函数,并且进行修改:
我们看到上传成功了,接下来还是中国菜刀菜刀!
文件上传路径也给出来了!菜刀构造路径:http://192.168.24.140/pikachu-master/vul/unsafeupload/uploads/pin.php/?hy=ipconfig
三、MIME type (服务端验证)
在此之前, 先拓展一个知识点:
MIME (Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型
MIME 是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的 MIME 类型,比如:
超文本标记语言:.html,.html text.html
普通文件:.txt text/plain
RTF文件:.rtf application/rtf
GIF图形:.gif image/gif
JPEG图形:.jpeg,.jpg image/jpeg
看到标题,相信小伙伴们应该有所猜想,服务端会设置验证!所以我们要欺骗服务端,抓包半路将文件名字进行修改
源码:
抓包:
可以看到文件上传成功了!注意注意:千万不要上传很上一模块同名字的木马,不存在覆盖,反而导致上传失败!
四、getmagesize(基于文件内容上传检测)
getimagesize(string filename) 函数
函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。即函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
可以看到,High级别的代码读取文件名中最后一个”.”后的字符串, 即取最后一个后缀,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。
这个我们在在半路修改上传的类型就不可以了,这个会直接检测上传文件的内容。
方法一:添加jpg图片的格式头到脚本
pinbo.jpg 内容:
GIF89
<?php
phpinfo();
?>
抓包看一下:
上传成功:
方法二:制作图片与木马的结合体:jpg+php
使用cmd命令结合到一起:
看到上传图片成功!
地址:uploads/2020/04/06/4881335e8a078d8c713504141791.png
但是我们访问这个图片,恶意代码是不会被执行的。我们可以结合本地文件包含漏洞进一步利用,组合,猜测上传图片所在的位置:
http://192.168.24.140/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/04/06/4881335e8a078d8c713504141791.png&submit=提交查询
这样就可以拿到里面的敏感信息了!
方法三:上传一句话木马,来获取shell权限
五、文件上传漏洞的防范措施
1. 不要在前端使用js实施上传策略。
2. 通过服务端对上传文件进行限制:
A)进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性。
B)对上传的文件在服务器上存储时进行重命名(制定合理的命令规则)。
C)对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害。