前言
本篇文章用于巩固对自己文件下载漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: pikachu Unsafe Filedownload 不安全的文件下载 (皮卡丘漏洞平台通关系列))
文件包含漏洞简述
1.漏洞描述
一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。
2.漏洞原理
给用户提供了一个下载的功能,并能接收相关的参数变量
开发时候,使用了读去文件的相关函数
对前端用户读取文件请求,没有进行相应的控制或控制不严(限制、校验)
能输出请求文件的内容,提供给前端下载
3.漏洞危害
可以下载服务器的任意文件:
-
获得网站web源码,再对代码进行审计,以获得更多的漏洞
-
获得网站、服务器、系统、数据库等中间件配置文件
-
获得应用于系统配置文件
-
对内网的信息进行一个探测
-
下载各种.log文件,并寻找后台地址、文件上传点等地方
4.漏洞发现
-
通过web漏洞扫描工具对网站实施扫描可能发现任意文件读取/下载漏洞,发送一系列”…/”字符来遍历高层目录,并且尝试找到系统的配置文件或者系统中存在的敏感文件。
-
也可通过判断网站语言,并根据其url中部分提供的参数,进行构造相关的路径信息,如收集到网站中间件版本为apache,则想办法构造…/…/…/ WEB-INF/web.xml等,然后查看其是否可被读取或者下载出来。
-
有些WAF会过滤…/,可以构造 /.%252e/.%252e/.%252e/ , %25对应的是%,%2e对应的是.,所以 .%252e/ 对应的是 …/
5.如何防御
- 净化数据:对用户传过来的文件名参数进行统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
- 任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的websphere的任意文件下载漏洞,需更新其中间件的版本可修复。
- 要下载的文件地址保存至数据库中。
- 文件路径保存至数据库,让用户提交文件对应ID下载文件。
- 用户下载文件之前需要进行权限判断,open_basedir 中可以设置访问权限
- 文件放在web无法直接访问的目录下。
- 将.过滤,不允许提供目录遍历服务。
- 公开文件可放置在web应用程序下载目录中通过链接进行下载。
正式闯关
进入本关发现看到下图的页面,点击球员名字可以下载头像图片
点击之后直接下载了,没有页面跳转,地址栏的url没有变化
右键 查看网页源代码
通过球员名称快速定位到相关代码
类似 <a href="execdownload.php?filename=ai.png"
>阿伦.艾弗森</a>
对应的就是文件下载的点
把execdownload.php?filename=
和当前网页路径组装起来,后面接上我们想要的文件路径:
由于我这靶场搭建目录在D盘搭建的,所以无法获取C盘系统目录文件,下面就用下载D盘其他文件进行演示
比如payload: http://www.pikachu.com:90/vul/unsafedownload/execdownload.php?filename=../../../shell.txt
一个../
就是跳出一级目录到上一级目录下,具体有多少…/可以通过已有的信息算,或者一个一个摸索。
浏览器地址栏输入这个payload,shell.txt被成功下载。
此外注意,这关如果用绝对路径,比如 http://ip:port/pikachu/vul/unsafedownload/execdownload.php?filename=D:\study\apache-tomcat-8.5.33\xiaopi\phpstudy_pro\WWW\pikachu-master/shell.txt
是不能成功的,具体原因下一部分分析代码的时候讲。
代码分析
首先来看看代码,为什么只能用相对路径不能用绝对路径,以及为什么会出现不安全的文件下载漏洞
和本漏洞无关的代码就没有截进来了
首先,从第10行可以看出来,传入的参数前面是拼接了download目录的,这就是为啥本关用绝对路径不好使的原因。
不信的话,可以把这行改成下面这样,前面不拼接download目录:
这样用绝对路径就能成功了,这里是浏览器自动防御了,但是可以证明是可以下载的。
那之所以有不安全的文件下载漏洞的原因是,服务器代码没有对输入的filename进行过滤,只是检查了以下文件是否存在,如果存在就下载了。
这关的一种防御方法是进行白名单过滤,只允许下载的文件是download文件夹下的那些图片:
图片太多了。。。选个ai.png来意思一下。。。修改代码如下,15行增加对文件路径的白名单过滤
尝试下载ai.png,可以下载成功
输入之前的payload: http://www.pikachu.com:90/vul/unsafedownload/execdownload.php?filename=../../../../shell.txt
发现下载失败,成功防御