一、环境
测试工具:Burp Suite
浏览器:火狐
靶场:Pikachu
二、不安全的文件下载
1、概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(如…/…/…/etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
2、防范措施
- 在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。
- 对传入的文件名进行严格的过滤和限定
- 对文件下载的目录进行严格的限定;
- 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
三、不安全的文件上传
1、概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击者可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器webshell。
2、文件上传漏洞测试流程
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);
- 尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果;
- 查看html源码,看是否通过js在前端做了上传限制,可以绕过;
- 尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等;
- 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试;
3.绕过前端验证
(1)删除前端验证
(2)上传一句话木马system.php
<?php system($_GET[x]);?>
(3)访问木马,控制后台服务器
4、绕过服务端验证(MIME)
(1)MIME介绍
MIME(Mutipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件
用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来
打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本.html,.html text/html
- 普通文本.txt text/plain
- RTF文本.rtf application/rtf
- GIF图形.gif image/gif
- JPEG图形.ipeg.jipg image/jpeg
(2)上传xxx.php提示"上传的图片只能是jpg,jpeg,png格式的!"
(3)在【Burp Suite】-> 【重发器】中,将Content-Type: application/octet-stream改为Content-Type: image/png,点击重发,显示路径表示上传成功。
5、绕过服务端验证(Getimagesize())
(1)Getimagesize ( ) 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
(2)图片木马的制作:
-
方法1 :直接伪造头部GIF89A
-
方法1.CMD: copy /b ai.png+system.php ccc.png
-
方法2.使用GIMP (开源的图片修改软件), 通过增加备注,写入执行命令
(3)上传ccc.png
(4)这是需要文件包含漏洞来执行木马(需要猜测木马的位置)
四、防范措施
1、不要在前端使用JS实施上传限制策略
2、通过服务端对上传文件进行限制:
- 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
使用JS实施上传限制策略
2、通过服务端对上传文件进行限制:
- 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
- 对服务器端上传文件的目录进行权限控制(比如只读) , 限制执行权限带来的危害