Pikachu靶场之不安全的文件下载漏洞详解

前言

本篇文章用于巩固对自己文件下载漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: 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
发现下载失败,成功防御
在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值