不安全的文件下载和上传
一、文件下载漏洞
相信大家都见过,很多网站都提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。
但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。(又称:任意文件下载)
1、靶场测试
随便打开一个连接就可下载图片:
如下图所示,这是请求下载的url:
如图所示,该请求是get方式通过url传入文件名下载的
于是尝试更改传参内容:../../../../../../../../etc/passwd
从网页当前目录跳转到/etc/passwd然后下载passwd文件
提交payload | 成功下载passwd文件 |
---|---|
payload2: ../../../../../../../etc/fstab
提交payload | 成功下载fstab文件 |
---|---|
说明该网页存在任意文件下载漏洞。
源码分析:----------------------------------execdownload.php
2、防范措施
- 对传入的文件名进行严格的过滤和限定(白名单限制或过滤敏感字符)。
- 对文件下载的目录进行严格的限定。
二、文件上传漏洞
很多时候因为业务功能需要,一些web站点都有文件上传的接口,比如:
1、注册时上传头像图片(比如jpg,phg,gif等)
2、上传文件附件(doc,xls等)
但是在后台开发时,没有对上传的文件功能进行安全考虑或采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过对该恶意文件的访问来控制整个web后台。
1、测试流程
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);(判断限制的信息,比如弹窗有可能是前端限制)
- 尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果。
- 查看html源码,看是否通过js在前端做了上传限制,可以绕过。
- 尝试使用不同方式进行绕过:黑名单绕过/MIME类型绕过/目录0x00截断绕过等。
- 猜测或结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。
2、靶场测试
-
第一关client check (前端绕过)
尝试上传一张图片,结果说是权限不足
然后更改目录权限:
chmod 777 unsafeupload
然后上传成功!
尝试上传php文件,结果失败:
出现弹窗,猜测是前端做了限制,于是页面审查元素:
查看网页源码,发现是checkFileExt()函数做了过滤:
于是,直接更改前端代码,重新上传:
木马上传成功:
命令执行成功!
-
第二关MIME type (服务端绕过)
知识补充:
什么是MIME?
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件的打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本 .html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 .ipeg,.jpg image/jpeg
$_FILES()函数
通过使用PHP的全局变量数组$_FILES,你可以从客户计算机向远程服务器上传文件。第一个参数是表单的input name,第二个下标可以是“name”,“type”,“size”,“tmp_name”或“error”。例如:
- $_FILES[file][name] 被上传文件的名称
- $_FILES[file][type] 被上传文件的类型
- $_FILES[file][type] 被上传文件的大小,以字节计算
- $_FILES[file][size] 被上传文件的临时副本的名称
- $_FILES[file][error] 由文件上传导致的错误代码
先按要求上传一个图片测试一下:
如图所示,上传成功!
尝试上传php文件:
如图所示,报错!
用brupsuite抓包看看:
更改数据包重发:
如图,更改后文件上传成功!
然后可以利用传参的方式执行一句话木马了。
- 第三关getimagesize (服务端绕过)
知识补充:
getimagesize()函数
用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
getimagesize()通过文件头部的字符串来判断文件的类型
比如:查看一张png图片的十六进制
该图片格式的头部都是8950 4e47,所以就判断它是一个png格式的图片。
制作图片木马--------------------------------------------------------------------------------------------------
也就是说在图片十六进制信息的末端添加一句话木马,从而将木马伪装成图片:
在windows下,将php文件添加到图片文件中生成新的图片ccc.png
copy /b ai.png + test.php ccc.png
将ccc.png文件上传:
在服务器端查看ccc.png文件的十六进制信息:
xxd ccc.png
发现php文件内容已被写入图片末端。
这时发现虽然php代码已被写入图片并且上传在服务器中,但是无法运行php代码,这时我们就要结合本地文件包含漏洞,将图片文件包含在后端代码中运行。
于是需要猜测木马图片文件的目录(一般情况下需要暴力破解),并且拼接到含有本地文件上传漏洞的url中的参数中,多试几次跳转到所在目录中,成功包含并输出php代码的内容(phpinfo()):
3、防范措施
- 不要在前端使用JS实施上传策略
- 通过服务端对上传的文件进行限制:
- 进行多条件组合检查:比如文件的大小、路径、扩展名、文件类型、文件完整性
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
- 对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害。