任意文件读取漏洞
文章目录
- 任意文件读取漏洞
- 漏洞场景
- 漏洞危害
- 漏洞分类
- 任意文件读取
- 重要函数
- readfile()
- file_get_contents()
- fread()
- $_GET任意文件读取
- 任意文件下载
- html实现a标签
- PHP实现
- 任意文件下载
- 任意⽂件读取攻防
- 过滤../
- 防守
- 绕过
- 任意文件读取挖掘
- 漏洞防御
一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是源代码文件,配置文件,敏感文件等等
- 任意文件读取会造成(敏感) 信息泄露;
- 任意文件读取大多数情况是由于其他漏洞引发的,如RCE、目录遍历、文件包含等
- 任意文件读取与任意文件下载本质上没有区别,信息都是从服务端流向浏览器的
任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来讲,读取与下载都需要读权
展
漏洞场景
- 存在读取文件的功能或函数,也就是web开放了文件读取功能
- 读取文件的路径客户端可控,完全控制或影响文件路径参数
- 没有对文件路径进行校验或者校验不严导致校验被绕过
- 输出了文件的内容
漏洞危害
下载服务器任意文件,包括源代码文件、系统敏感文件、配置文件等等
可以配合其他漏洞,构成完整攻击链
对源代码文件进行代码审计,查找更多的漏洞
任意文件读取与下载重点关注的文件:
- 源代码
- 配置文件
- 敏感文件
- 日志文件
漏洞分类
-
任意文件读取
-
任意文件下载
任意文件读取
重要函数
readfile()
功能:
- 直接读取文件内容
- 自带输入功能
$path="";
readfile($path);
file_get_contents()
功能:
- 直接读取文件内容
- 需要输出读取内容
要绝对路径,如果页面空白查看源代码
$path="";
echo file_get_content($path)
fread()
功能:
- 打开文件
- 计算文件大小
- 读取文件
- 输出文件
- 关闭文件
使用方法分三步
打开
读取
关闭
$path="";
$f= fopen($path,"r");
echo fread($f,1024) //需要加字节数
fclose($f);
$path="";
$f=fopen($$path,"r");
$f_size=filesize($path);//读取字节数
echo fread($f,$f_size);
fcose($f);
$_GET任意文件读取
$path=@$_GET['filepath'];
如果说服务器限制必须需要绝对路径可以加一堆…/…/ 因为根目录就没有上级了,达到文件读取的目的
任意文件下载
条件:
- 已知目标文件路径
- 目标文件路径,客户端可控
- 没有经过校验或检验不严格
html实现a标签
<a href='路径' target="_blank">文件下载</a>
跳转右键另存为
PHP实现
$path="";
header("Content-Type:image/jpg(文件类型)");
header('Content-Disposition:attachment;fileName='.basename($path));
readfile($path)
任意文件下载
$path = $_GET['filepath'];
任意⽂件读取攻防
过滤…/
防守
$path = @$_GET['filepath'];
$path = str_replace("../","",$path);
readfile($path);
绕过
- 使用绝对路径 C:/windows/users/…
- 双写绕过 …/…/./…/./etc/passwd
- 在windows环境下可以尝试…\ 使用反斜杠,因为windows的包容性斜杠和反斜杠都能识别
任意文件读取挖掘
从⽂件名上看
- readfile.php
- filedownload.php
- filelist.php
从参数名上看
- f=
- file=
- filepath=
- fp=
- readfile=
- path=
- readpath=
- url=
- menu=
- META-INF=
- WEB-INF=
- content=
漏洞防御
-
添加输入验证,让 web 用户只能访问(读取),所需要的文件和路径。
-
不能有文件包含漏洞,目录遍历漏洞或其他漏洞。因为漏洞会引发连锁
-
限定文件访问范围,让用户不能访问 Web 根目录以外的路径。
open_basedir = c:\www\