任意文件读取漏洞
概述
漏洞成因
- 存在读取文件的功能(Web应用开放了文件读取功能)
- 读取文件的路径客户端可控(完全控制或者影响文件路径)
- 没有对文件路径进行校验或者校验不严格导致被绕过
- 输出文件内容
漏洞危害
- 下载服务器中的文件(源代码文件、系统敏感文件、配置文件等)
- 可以配合其他漏洞,构成完整的攻击链。
- 对源代码进行审计,查找更多漏洞。
任意文件读取漏洞
文件读取函数(PHP)
读取文件函数 | 函数特点 |
---|---|
readfile() | 直接读取文件内容自带输出功能 |
file_get_contents() | 直接读取文件内容需要输出读取内容 |
fread() | 需要使用fopen()函数打开一个文件计算文件的大小读取文件输出文件关闭文件 |
readfile:
//readfile.php
$fp = "../phpinfo.php";
readfile($fp);
file_get_contents:
//file_get_contents.php
$fp = "../phpinfo.php";
echo file_get_contents($fp);
fread:
//fread.php
$fp = "../phpinfo.php";
$f = fopen($fp,'r');
$f_size = filesize($fp);
echo fread($f,$f_size);
fclose($f);
任意文件读取:
$fp = $_GET['filepath'];
readfile($fp);
使用filepath传递,在filepath中输入地址来获取文件内容
使用Burp抓包:
结果:
任意文件下载漏洞
PHP实现文件下载
<?php
$fp = './111.jpg';
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp));
readfile($fp);
任意文件下载
$fp = $_GET['filepath']
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp));
readfile($fp);
任意文件读取攻防
路径过滤(…/)
1.过滤 …/
使用str_replace进行替换
$fp = $_GET['filepath'];
$fp = str_replace("../","");
readfile($fp);
简单绕过
1.双写绕过
..././..././..././windows/system32
2.绝对路径
C:/windows/system32
**3.使用…\ **
..\..\..\windows\system32
任意文件读取挖掘
手工挖掘
从文件名上看 | 从参数名上看 |
---|---|
readfile.php filedownload.php filelist.php . . . | f = file = filepath = fp = readfile = path = readpath = url = menu = META-INF = WEB-INF = content = . . . |
漏洞修复方案
输入验证
让用户只能访问一定的路径
限定文件的访问范围
让用户不能访问根目录以外的路径:
php.ini配置文件中,限定文件访问范围
open_basedir = c:\www\
不包含其他漏洞
不能有文件包含漏洞,目录遍历漏洞或者其他漏洞