0


任意文件读取与下载漏洞

文章目录

文件读取漏洞(列目录漏洞)

概念及成因

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。其中的目录遍历是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是web根目录以外的文件),甚至执行系统命令。更严重的,导致SSRF漏洞,进而漫游至内网。

探测与危害

可以利用web漏洞扫描器(御剑等)扫描web应用进行检测,也可通过搜索,网站标题包含 “index of” 关键词的网站进行访问,手工探测等。

攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者; 攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)。简要来说就是老家被偷了。

文件下载漏洞

概念

一些网站由于业务需求,往往需要提供文件查看或文件下载功能,如果对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载服务器的任意敏感文件,可以是源代码文件、系统敏感文件等,这就是文件下载漏洞。通过任意文件下载漏洞,攻击者可以对操作系统或程序代码进行深入的研究,然后配合敏感文件中的敏感信息对服务器进行更深层次的入侵。

文件下载的两种方式

先来了解一下常规的网页文件下载的两种形式:
1、直接下载:

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

2、增加header头

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

如何挖掘

1、通过页面信息进行挖掘

我们可以通过查看网页源代码来查找是否有readfile()、file_get_contents()、fopen()等函数(这就与文件读取函数联动了),如果$filename没有经过校验或者校验不合格,用户就可控制变量读取任意文件,如/etc/passwd、/index.php、/config.ini等

2、通过url链接进行挖掘

常见的包含在url链接中的有

一般链接形式:
download.php?path=
download.php?file=
down.php?file=
data.php?file=
readlife.php?file=
read.php?filename=

或者包含参数:

&url=

&file_name=

&Filepath=

&Path=

&Data=

3、在脚本代码种进行挖掘

涉及到代码审计知识

一些敏感文件

知道有文件下载漏洞就可以干坏事儿了,下面列出了一些敏感文件

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配置信息

Linux:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.conf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置

实例

云演任意文件下载

关卡1
点进去有个下载链接,但是是 fake_flag.txt
在这里插入图片描述
不过它直接提醒了 flag 真正的藏身之处是 flag.txt,那我们直接在 url 中输入

filename=flag.txt

即可获取
在这里插入图片描述
这题有点过于简单了…

关卡2
进去发现给了我们两首歌的链接,点击也确实下载了
在这里插入图片描述
查看它的网页源码发现是这么写的:

<divid="templatemo_content_wrapper"><divid="templatemo_content"><divclass="content_title_01">壮士,来听首歌吧</div><divclass="horizontal_divider_01">&nbsp;</div><divclass="cleaner">&nbsp;</div><p>为了让大家更轻松的比赛,为大家准备了两首歌让大家下载</p><p><ahref="download.php?url=Y2hvdWJhZ3VhaS5tcDM="target="_blank">丑八怪</a></p><p><ahref="download.php?url=T25lIExvdmUubXAz"target="_blank">One Love</a></p><divclass="cleaner">&nbsp;</div></div><divclass="cleaner">&nbsp;</div></div><divid="templatemo_footer"></div>

其中

<p><a href="download.php?url=Y2hvdWJhZ3VhaS5tcDM=" target="_blank">丑八怪</a></p>

<p><a href="download.php?url=T25lIExvdmUubXAz" target="_blank">One Love</a></p>

中参数 url 后面的那一串是啥呢?联系之前的知识,不难猜测出这串字符应该是经过 base64 编码之后的结果,尝试解码看看到底是啥。

使用 hackbar 解码后,发现分别是

choubaguai.mp3

One Love.mp3

,看来与我们的猜测吻合。看到这大抵是猜测存在文件下载漏洞了,并且还含有文件包含漏洞,多半是这个 download.php 文件的锅。我们先直接让它包含自己试试,当然跟前面一样,需要编码。发现是可以直接下载的,打开发现:

<?phperror_reporting(0);include("hereiskey.php");$url=base64_decode($_GET[url]);if($url=="hereiskey.php"||$url=="choubaguai.mp3"||$url=="One Love.mp3"||$url=="download.php"){$file_size=filesize($url);header("Pragma: public");header("Cache-Control: must-revalidate, post-check=0, pre-check=0");header("Cache-Control: private",false);header("Content-Transfer-Encoding: binary");header("Content-Type:audio/mpeg MP3");header("Content-Length: ".$file_size);header("Content-Disposition: attachment; filename=".$url);echo(file_get_contents($url));exit;}else{echo"Access Forbidden!";}?>

没有对包含的文件进行任何的过滤检查,确实是存在文件包含漏洞。此外,我们还发现了一个 hereiskey.php 文件,那我们故技重施,把这个文件下下来康康(别忘了编码)

<?php// key is d0wnload_0k?>

成功得到key

pikachu靶场 UnSafe FileDownload

跟前面一样,点击链接发现是成功下载的
在这里插入图片描述
查看源码:

<divid="usd_main"style="width: 600px;"><h2class="title">NBA 1996年   黄金一代</h2><pclass="mes"style="color: #1d6fa6;">Notice:点击球员名字即可下载头像图片!</p><divclass="png"style="float: left"><imgsrc="download/kb.png"/><br/><ahref="execdownload.php?filename=kb.png">科比.布莱恩特</a></div></div>

没什么大问题,跟上面一样,先尝试直接包含自己试试
在这里插入图片描述
发现找不到该文件,最大的可能性就是此文件并不存在根目录下,返回上一级试试
在这里插入图片描述
发现成功下载到了该文件,我们再去后端看看它的代码逻辑,其中

include_once$PIKA_ROOT_DIR."inc/function.php";

说明其存在文件包含漏洞,而

$file_path="download/{$_GET['filename']}";

说明球星图片文件是与 execdownload.php 一同存在 download 目录下的,所以使用 …/ 跳过上级

如何预防

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

标签: web安全 web

本文转载自: https://blog.csdn.net/lbwnbnbnbnbnbnbn/article/details/124017957
版权归原作者 西电卢本伟 所有, 如有侵权,请联系我们删除。

“任意文件读取与下载漏洞”的评论:

还没有评论