pikachu Unsafe Fileupload
不安全的文件上传漏洞概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
1.验证文件类型、后缀名、大小;
2.验证文件的上传方式;
3.对文件进行一定复杂的重命名;
4.不要暴露文件上传后的路径;
5.等等...
文件上传漏洞测试流程
1.对文件上传的地方按照要求上传文件,查看返回结果(路径、提示等)
2.尝试上传不同类型的“恶意”文件,比如1.php,分析结果。
3.查看html源码,是否通过js在前端做了限制,如果有的话可以绕过
4.尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等
5.猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。
client check
这里可以观察源码,是通过js判断是否上传的文件为png,jpg,gif的类型
如果不是会进行弹窗提示。操作完全是通过前端js限制的,所以就很容易绕过
可以直接F12将onchange调用的函数删掉,上传.php文件
比如文件里用 <?php @eval($_POST['cmd']); ?>
经典的一句话木马配合菜刀就可以
拿到webshell。
因为我们最终还要访问这个文件,所以一定要知道上传文件所保存的路径,
如果前端没有显示,就需要我们自己去判断,进而通过上传的木马文件拿到webshell
服务端验证绕过之MIME
什么是MIME?
MIME(Multipurpose Internet Mail Extensions)多用途互连网右键扩展类型。
当一个浏览器对一个文件进行识别的时候,他会给文件定义一个类型,放在
http的头部的content-type里面,比如上传图片,就会自动识别是jpg或者png等
php中$_FILES()函数
这里的源码就是利用$_FILES()函数获取前端http头部传来的content-type
用来验证是否与mime中的格式一致,因为前端的content-type是用户可以控制的
所以很危险。
上传一个图片和.php文件抓包看一下,图片格式的成功了,而php的没有。
虽然我的图片格式的文件只是改了扩展名的php文件,但是后台没有做过滤,所以
也会成功。
可以看到成功的这里MME类型是jpeg
发送到repeater,把php文件的MIME类型改为 image/jpeg即可绕过
服务端绕过之getimagesize()
这个函数返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是
图片的话会存在问题,因为图片头可以被伪造。
比如png图片固定字符串为 8950 4e47 (可用xxd命令在Linux下查看图片格式)
图片木马制作:
1.直接伪造头部GIF89A
2.在cmd中:copy /b test.png + muma.php cccc.png 将代码插入到图片文件里面
3.使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令
其实第二种方法也可以记事本打开图片将代码直接粘贴在最后面
之后要利用文件包含解析出图片格式文件中的php代码
复制文件路径,然后在文件包含模块中让后台识别这个路径并处理
../../../../unsafeupload/uploads/2020/04/01/6336195e846dc76f7b1937151279.png
之后连接中国菜刀即可获得webshell
文件上传漏洞防范措施
1.不要在前端JS上做限制,不靠谱
2.进行多条件组合查询:文件类型,大小,扩展名
3.对上传的文件在服务器上存储时进行重命名
4.对上传上来的文件进行权限控制,比如只读,至少不能去执行