本文首发在先知社区

0x00前言

上周参加了一个线上赛。有个Web题的WriteUp说是任意文件下载。由于之前没学过,所以就没有想到。现在学习一下

0x01为什么产生任意文件读取与下载漏洞

一些网站的业务需要,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,就能够查看或下载任意的文件,可以是源文件,敏感文件等等。

0x02任意文件读取漏洞

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。
漏洞产生原因

  • 存读取文件的函数
  • 读取文件的路径用户可控,且未校验或校验不严
  • 输出了文件内容

任意文件读取

<?php
$filename=”test.txt”;
readfile($filename);
?>
<?php
$filename=”test.txt”;
echo file_get_contents($filename);
?>

文件读取函数
readfile()file_get_contents()fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd./index.php/config.ini

0x03任意文件下载漏洞

一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件,这就是文件下载漏洞。
漏洞产生原因

  • 有读取文件的函数
  • 读物文件的路径用户可控,且没有经过校验,或者校验不严格
  • 输出文件内容
  • 一个正常的网站,存在一个下载文件的功能,同时还会从浏览器接收文件名字

文件下载的两种方式
1、直接下载:

<a href=”http://www.a.com/xxx.rar”>下载</a>

2、增加header头

<?php$filename = $_GET['filename'];echo '<h1>讲开始下载文件!</h1><br /><br />';echo file_get_contents($filename);header('Content-Type: imgage/jpeg');header('Content-Disposition: attachment; filename='.$filename);header('Content-Lengh: '.filesize($filename));
?>

漏洞利用方式


利用思路

  • 下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
  • 下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
  • 下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。

尝试读取/root/.bash_history看自己是否具有root权限。
如果没有,就只能利用../来回跳转读取一些.ssh下的配置信息文件。
读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。然后逐个下载需要审计的代码文件,但是下载的时候变得很繁琐,只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。

一些常见利用方式

java+oracle环境

可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器。

也可以先下载网站的配置文件,在根目录/WEB-INF/Web.xml的(一般都有很多内容,有时含有数据库连接用户名和密码等关键信息)。

具有root权限

在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。

当我们不知道路径是什么的情况下,这个可以说是一个核武器了,我们利用任意文件下载漏洞将mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。
locate 读取方法

locate mlocate.db admin

可以将mlocate.db中包含admin内容全部输出来。

利用这个文件可以获取到该服务器任何我们想要的内容并下载出来而不用一个一个去猜解目录,但是这个文件只有root用户才能读取。另一方面我们也可以利用linux内核的一个文件/proc/self/cmdline当前进程的cmdline参数,可以获取到路径信息。

总的来说,任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务器漏洞从而入侵。

0x04任意文件读取与下载漏洞挖掘

1、web漏洞扫描器(awvs、appscan、openvas、nessus)
2、手动挖掘从连接和参数名查看

Google search

inurl:”readfile.php?file=
inurl:”read.php?filename=
inurl:”download.php?file=
inurl:”down.php?file=

连接:
readfile.php?file=**.txt
download.php?file=**.rar
参数名:
&RealPath=&readpath=&FilePath=&filepath=&Path=&path=&Inputfile=&inputfile=&url=&urls=&Lang=&dis=&Data=&data=&readfile=&filep=&Src=&src=&menu=META-INF=WEB-INF

0x05敏感信息

Windows:

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息

Linux:

/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

0x06任意文件读取与下载漏洞验证

任意文件读取验证

示例代码:

<?php
$filename=$_GET['f'];
echo file_get_contents($filename);
?>

测试:

readfile.php?f=../../../../../../etc/passwd
readfile.php?file=../../../../../../../../etc/passwd%00

readfile.php?f=../index.txt


file://伪协议 ,读取文件内容

readfile.php?f=file:///etc/passwd

任意文件下载验证

示例代码:

<?php
$filename = $_GET['f'];
echo '<h1>讲开始下载文件!</h1><br /><br />';
echo file_get_contents($filename);header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>


当然,我下载这个文件并没有内容。

0x07漏洞判断

参数f的参数值为PHP文件时:

1.文件被解析,则是文件包含漏洞
2.显示源代码,则是文件查看漏洞
3.提示下载,则是文件下载漏洞

0x08漏洞防御修复

通用

  • 过滤 . 点,使用户在url中不能回溯上级目录
  • 正则严格判断用户输入的参数
  • php.ini配置open_basedir限定文件访问范围

文件下载漏洞修复

  • 将下载区独立出来,放在项目路径外,给每个下载资源固定的URL,而不是所有的下载资源都是统一的URL:http://www.test.com/download?filename=文件名
  • 净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
  • web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot应用。由chroot创造出的那个根目录,叫做“chroot监狱”(所谓”监狱”就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。
    详细具体chroot的用法,可参考:http://blog.csdn.net/frozen_fish/article/details/2244870
  • 任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的websphere的任意文件下载漏洞,需更新其中间件的版本可修复。
  • 要下载的文件地址保存至数据库中。
  • 文件路径保存至数据库,让用户提交文件对应ID下载文件。
  • 用户下载文件之前需要进行权限判断。
  • 文件放在web无法直接访问的目录下。
  • 不允许提供目录遍历服务。
  • 公开文件可放置在web应用程序下载目录中通过链接进行下载。
  • 记录文件下载日志。

0x09漏洞利用实战

我学习任意文件读取与下载漏洞,就是因为遇到了一个任意文件读取与下载漏洞的Web题,所以在此实战一下
RoarCTF2019-Web:Easy Java

不是弱口令,也不能扫出目录。只有一个help.docx文件可以下载。于是可能是任意文件下载漏洞。
点击蓝字“help”,抓包,发包。发现GET方式一直什么都下载不了。后来修改为POST,就可以下载了。

因为题目提示java,所以可以先下载网站的配置文件,在根目录WEB-INF/web.xml

发现操作flag的关键文件位置,读取(或下载)/WEB-INF/classes/下的flag的关键文件位置,又因为Java字节码类文件(.class)是Java编译器编译Java源文件(.java)产生的“目标文件”。
最终得出flag的关键文件位置为:/WEB-INF/classes/com/wm/ctf/FlagController.class

Base64解码得到flag

任意文件读取与下载漏洞相关推荐

  1. 任意文件读取与下载漏洞学习

    原理: 任意文件读取漏洞属于文件操作类漏洞,一般常见于PHP/java/python语言中.任意文件读取漏洞,就是可以任意读取服务器上部分或者全部文件的漏洞,攻击者利用此漏洞可以读取服务器敏感文件如/ ...

  2. 任意文件读取及删除漏洞

    任意文件读取漏洞及危害 通过提交专门设计的输入,攻击者就可以在被访问的文件系统中读取或写入任意内容,往往能够使攻击者从服务器上获取敏感信息文件,正常读取的文件没有经过校验或者不严格,用户可以控制这个变 ...

  3. windows文件读取 xxe_XXE任意文件读取(当xml解析内容有输出时)

    利用XXE漏洞读取文件 参考:https://www.jianshu.com/p/4fc721398e97 首先找到登录源码如下: 由题目可以利用XXE漏洞读取文件 先登录用Burp Suite抓包: ...

  4. 读取txt原理_Mysql客户端任意文件读取学习

    前言 最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞. 漏洞形成原因 此漏洞形成的主要原因在于 LOA ...

  5. 目录浏览(目录遍历)漏洞和任意文件读取/下载漏洞

    目录 目录浏览(目录遍历)漏洞 任意文件读取/下载漏洞 目录浏览(目录遍历)漏洞 目录浏览漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件 ...

  6. Ruby on Rails路径穿越与任意文件读取漏洞分析(CVE-2019-5418)

    Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上.它被宣传为现有企业框架的一个替代,而它的目标,就是让 Web 开发方面的生活 ...

  7. gitlab 更新文件_GitLab任意文件读取漏洞公告

    2020年4月28日,GitLab的一个任意文件读取漏洞的漏洞细节被公开.该漏洞补丁于2020年3月26号由GitLab官方发布.深信服安全研究团队依据漏洞重要性和影响力进行评估,作出漏洞通告. 漏洞 ...

  8. 银达汇智 智慧综合管理平台 FileDownLoad.aspx 任意文件读取漏洞

    漏洞描述: 银达汇智 智慧综合管理平台 FileDownLoad.aspx 存在任意文件读取漏洞,通过漏洞攻击者可下载服务器中的任意文件. 漏洞利用条件: / 漏洞影响范围: 银达汇智 智慧综合管理平 ...

  9. CVE-2020-25540:ThinkAdmin未授权列目录/任意文件读取漏洞复现

    目录 1. 简介 2. 影响范围 3. 环境搭建 3.1 安装Composer 4. 漏洞复现 4.1 列举目录 4.2 任意文件读取 1. 简介 ThinkAdmin 是基于 ThinkPHP后台开 ...

  10. ThinkAdmin列目录/任意文件读取(CVE-2020-25540 )漏洞复现及环境搭建

    ThinkAdmin列目录/任意文件读取(CVE-2020-25540 )漏洞复现 漏洞介绍 ThinkAdmin 是基于 ThinkPHP后台开发框架,在ThinkAdmin v6版本存在路径遍历漏 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task13. 罗马数字转整数
  2. java jibx_Jibx 处理XML
  3. 李宏毅线性代数笔记8 :坐标系变换8
  4. requestparam的作用_关于@RequestMapping和@RequestParam注解(四)
  5. 面向对象的两大迷思,再给你们解答一次
  6. 对初级软件开发者的建议(1)
  7. 13-微信小程序商城 产品简介布局(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  8. python向excel删除数据_python 操作 excel 系列之:数据清洗
  9. intel服务器芯片组历史,Intel单路服务器芯片组披露
  10. Jetbot小车系列文章学习
  11. 暑期机器学习小组读书报告----机器学习概述
  12. 2017年7月工作总结
  13. 个人形象设计之服装单品的理想搭配
  14. JavaScript中方法或者变量名称前加下划线的是什么意思?
  15. 熔断器Hystrix
  16. 商城-3 查询商品详情页信息
  17. 算法的trick_目标检测算法中的常见trick
  18. 下一代Vuex(Pinia)不学你就out了
  19. 如何编写本地shellcode
  20. ddrelease64 黑苹果_[原]红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新7.7】...

热门文章

  1. 只需四天,从零开始选购笔记本电脑【转】【荐】
  2. bugku never_give_up file_get_contents()有php://input漏洞 eregi \x00绕过
  3. 【解决】Jupyter Notebook 内核似乎挂掉了,它很快将自动重启。
  4. vs2019配置glfw、glad等环境
  5. 【第三十一期】360后台开发实习面经 - 两轮技术面
  6. c语言 求圆周长 圆面积 圆球表面积 圆球体积 圆柱体积
  7. 【高等数学】第 2 讲 两个重要的极限定理
  8. 张朝阳也看蜗居,这段采访很有趣
  9. Artifact xxx:war exploded: Error during artifact deployment. See server log for details.
  10. WORD中图片叠加背景融合的方法