任意文件读取与下载
文章目录
前言
本次将学习任意文件读取漏洞和任意文件下载漏洞,这两个漏洞大体相同。
一、漏洞描述
任意文件读取漏洞(Arbitrary File Read Vulnerability)是指攻击者可以通过web应用程序读取任意文件而不受访问控制限制的漏洞。这种漏洞可能导致敏感信息泄露、系统崩溃等问题。
二、漏洞原理
一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是源代码文件,配置文件,敏感文件等等。
- 任意文件读取会造成敏感信息泄露。
- 任意文件读取大多数情况是由于其他漏洞引发的,如 RCE、目录遍历、文件包含等。
- 任意文件读取与任意文件下载本制上没有区别信息都是从客户端流向服务器的。
任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来读取与下载都需要读权限讲,
三、漏洞场景
不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的
- 存在读取文件的功能(函数),也就是说,Web 应用开放了文件读取功能;
- 读取文件的路径客户端可控,完全控制或影响文件路径参数;
- 没有对文件路径进行校验或者校验不严导致校验被绕过;
- 输出了文件的内容
四、漏洞评级
高危
五、漏洞危害
下载服务器任意文件,包括源代码文件、系统敏感文件、配置文件
可以配合其他漏洞,构成完整攻击链
对源代码文件进行代码审计,查找更多的漏洞
任意文件读取与下载重点关注的文件:
- 源代码
- 配置文件
- 敏感文件
- 日志文件
六、漏洞验证
任意文件读取
函数
读取文件的函数 | 函数特点 |
---|---|
readfile() | 直接读取文件内容、自带输出功能 |
file_get_contents() | 直接读取文件内容、需要输出读取内容 |
fread() | 打开文件、计算文件大小、读取文件、输出文件、关闭文件 |
验证
readfuke()
// readfile.php
<?php
$fp = "./a.php";
readfile($fp);
?>
// a.php
A!
file_get_contents()
//file_get_contents
<?php
$fp = "./b.php";
echo file_get_contents;
?>
// b.php
B
fread()
// fread.php
<?php
$fp = "./c.php";
$f = "$fp, 'r'";
$f_size = filesize($fp);
echo fread($f, 1024);
fclose($f);
?>
// c.php
C
任意文件下载
场景
任意文件下载的条件
- 已知目标文件路径
- 目标文件路径,客户端可控
- 没有经过校验或检验不合格
演示
//include.php
<?php
if (@$_GET['download'] == 'ok'){
$fp = "../csrf/1.jpg";
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp));
readfile($fp);
}else {
echo "<a href = '../csrf/1.jpg' target='_blank'>IMG Download</a>";
}
?>
进入界面在1处输入刚刚定义的方法
download=ok
打开文件夹查看
七、漏洞利用
通过任意文件读取漏洞读取敏感文件,为下一次攻击做铺垫
八、漏洞防御
- 让 web 用户只能访问(读取)所需要的文件和路径。
- 不能有文件包含漏洞、目录遍历漏洞或其他漏洞。
- 让用户不能访问 web 根目录以外的路径。
php.ini
配置文件中,可以通过选项open_basedir
来限定文件访问的范围
open_basedir = c:\www\
九、典型案例
metinfo_6.0.0_file-read