任意文件读取是什么?
一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕就可以查看或下载任意文件。这些文件可以是源代码文件配置文件敏感文件等等。过,
- 任意文件读取会造成(敏感)信息泄露;
- 任意文件读取大概率是由于其他漏洞引发的,如,RCE、目录遍历、文件包含等.
- 任意文件读取与任意文件下载本质上没有区别,信息都是从服务端流向浏览器的。
- 任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来讲,读取与下载都需要读权限。
任意文件读取是因为用户对下载的文件没有做限制或配置有缺陷而造成的漏洞,攻击者通过该漏洞可以窃取源代码、日志文件等重要文件的敏感信息。
为什么会出现任意文件读取?
不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的:
- 存在读取文件的功能 (函数),也就是说,Web 应用开放了文件读取功能
- 读取文件的路径客户端可控,完全控制或影响文件路径参数;
- 没有对文件路径进行校验或者校验不严导致校验被绕过,
- 输出了文件的内容
如果出现了任意文件读取漏洞,上面四个条件缺一不可。
文件读取漏洞也与系统的权限有关,下面是系统和软件的权限区别:
Windows + IIS + ASP/ASPX,一般是低权限
Windows + Apache + php,一般是高权限
Windows + Java,一般是高权限
Linux + Apache + PHP,一般是低权限
Linux + Nginx + PHP,不一定
Linux + Java,一般是高权限
它有什么危害?
任意文件读取可能会对造成下面信息的泄露:
- 源代码
- 配置文件
- 敏感文件
- 日志文件
文件读取怎么防御?
- 限定文件的访问范围,php.ini 配置open_basedir限定文件访问范围(设置白名单)
- 过滤关键字符
- 避免其他漏洞引起该漏洞
如下面的代码,设置一个只能访问a、b、c文件的白名单:
<?php
// $fp=/test .php"
$fp = @$_GET['file_path'];
if($fp == "a.php" or == "b.php" or $fp == "c.php"){readflie($fp);
}
else{echo "Please stop!";
}
echo $fp;
?>
php.ini 配置,只能读取下面代码中指定的C盘目录:
ini set("open basedir"
c:/phpstudy_2016/www/");