文章目录
- 1. Unsafe Filedownload
- 1.1 Unsafe Filedownload
- 1.1.1 源代码分析
- 1.1.2 漏洞防御
- 1.2 不安全的文件下载防御措施
1. Unsafe Filedownload
不安全的文件下载概述:
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。如果后台在收到请求的文件名后,将其直接拼接到下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如…/…/…/etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
漏洞原理
给用户提供了一个下载的功能,并能接收相关的参数变量,开发时候,使用了读去文件的相关函数,对前端用户读取文件请求,没有进行相应的控制或控制不严(限制、校验),能输出请求文件的内容,提供给前端下载。
漏洞危害
可以下载服务器的任意文件:
- 获得网站web源码,再对代码进行审计,以获得更多的漏洞
- 获得网站、服务器、系统、数据库等中间件配置文件
- 获得应用于系统配置文件
- 对内网的信息进行一个探测
- 下载各种.log文件,并寻找后台地址、文件上传点等地方
漏洞发现
-
通过web漏洞扫描工具对网站实施扫描可能发现任意文件读取/下载漏洞,发送一系列”…/”字符来遍历高层目录,并且尝试找到系统的配置文件或者系统中存在的敏感文件。
-
也可通过判断网站语言,并根据其url中部分提供的参数,进行构造相关的路径信息。
1.1 Unsafe Filedownload
点击球员下面的名字,然后图片就下载下来了。
复制图片的下载路径
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png
先构造一个假的管理员文件
然后构造playload
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../admin.txt
一个../
就是跳出一级目录到上一级目录下,../../../../
表示向上跳三级目录。
在浏览器页面中输入该路径,admin.txt文件就被下载下来了
注意:如果用绝对路径,例如 :http://192.168.188.183/pikachu/vul/unsafedownload/execdownload.php?filename=C:\Windows\System32\drivers\etc\hosts
无法成功。
1.1.1 源代码分析
发现在第10行的位置上,传递的参数前面拼接了download目录,这样就导致我们在输入绝对路径的时候无法进行下载文件了。
如果将前面拼接的download目录去掉,绝对路径就可以成功。
hosts文件下载成功。
不安全的文件下载漏洞的原因是,服务器代码没有对输入的filename进行过滤,只是检查了以下文件是否存在,如果存在就下载了。
1.1.2 漏洞防御
添加一个白名单过滤,让其只允许下载download文件夹下的图片资源。
修改源码:
由于图片太多,这里选用一个图片做实例。
if(!file_exists($file_path) || $file_path != "download/ai.png"){
skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');
return ;
}
输入之前构造的payload
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../admin.txt
发现下载失败,成功防御
1.2 不安全的文件下载防御措施
- 净化数据:对用户传过来的文件名参数进行统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
- 任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生。
- 要下载的文件地址保存至数据库中,让用户提交文件对应ID下载文件。
- 用户下载文件之前需要进行权限判断。
- 文件放在web无法直接访问的目录下。
- 将.过滤,不允许提供目录遍历服务。
- 公开文件可放置在web应用程序下载目录中通过链接进行下载。