任意文件读取

1.任意文件读取

​ 一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕就可以查看或下载任意文件。这些文件可以是源代码文件,配置文件,敏感文件等等。过,

  • 任意文件读取会造成(敏感)信息泄露
  • 任意文件读取大概率是由于其他漏洞引发的,如,RCE、目录遍历、文件包含等
  • 任意文件读取与任意文件下载本质上没有区别,信息都是从服务端流向浏览器的。

​ 任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来讲,读取与下载都需要读权限。

1.1漏洞成因

不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的

  • 存在读取文件的功能(函数),也就是说,Web 应用开放了文件读取功能。
  • 读取文件的路径客户端可控,完全控制或影响文件路径参数;
  • 没有对文件路径进行校验或者校验不严导致校验被绕过
  • 输出了文件的内容

1.2漏洞危害

下载服务器任意文件,包括源代码文件、系统敏感文件、配置文件等等。
可以配合其他漏洞,构成完整攻击链。对源代码文件进行代码审计,查找更多的漏洞。
任意文件读取与下载重点关注的文件:

  • 源代码
  • 配置文件
  • 敏感文件
  • 日志文件

1.3漏洞分类

  • 任意文件读取
  • 任意文件下载

1.4任意文件读取

1.4.1 文件读取

函数 含义
readfile() 直接读取文件内容
自带输出功能
file_get_contents() 直接读取文件内容
需要输出读取内容
fread() 打开文件
计算文件大小
读取文件
输出文件
关闭文件

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);

1.4.2 任意文件读取

变量$fp,会捕获GET 方式传递过来的filepath 参数

$fp = @$_GET['filepath'];

filepath 客户端可控,并且没有经过校验,会造成任意文件读取漏洞。

?filepath=index.php ?filepath=/etc/passwd
?filepath=c:\windows\system32\drivers\etc\hosts ?filepath=c:\phpstudy_2016\apache\conf\httpd.conf ?filepath=c:\phpstudy_2016\mysql\my.ini

 
?filepath=../../../../../../../../../../phpstudy_2016/www/phpinfo.php ?filePath=../../../../../../../../windows\system32\drivers\etc\hosts ?filePath=../../../../../../etc/hosts


1.5 任意文件下载

1.5.1 一般情况

a 标签下载:

<a href = './a.jpg'>IMG Downloada>

1.5.2 PHP 实现

PHP 文件下载实现过程:

  • 先读取文件

  • 在输出文件

  • 提供下载

// file-download.php

$fp = './a.jpg';
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp)); readfile($fp);

1.5.3 任意文件下载

任意文件下载的条件:

  • 已知目标文件路径

  • 目标文件路径,客户端可控

  • 没有经过校验或校验不严格

$fp = $_GET['filepath'];


?filepath=c:/windows/system32/drivers/etc/hosts ?filepath=/etc/passwd

2.任意文件读取攻防

2.1 路径过滤

2.1.1 过滤**…/**

$fp = @$_GET['filepath'];

$fp = str_replace("../","",$fp); readfile($fp);

2.2 简单绕过

2.2.1 双写绕过

?filepath=..././..././..././..././..././..././..././windows\system32\drivers\etc\hosts


2.2.2 绝对路径

?filepath=c:/windows\system32\drivers\etc\hosts

2.2.3 使用…\

?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts

3.任意文件读取挖掘

3.1 手工挖掘

从文件名上看 从参数名上看
readfile.php
filedownload.php
filelist.php
f=
file=
filepath=
fp=
readfile=
path=
readpath=
url=
menu=
META-INF=
WEB-INF=
content=

3.2 经典案例

metinfo_6.0.0_file-read

4.漏洞修复方案

4.1 输入验证

  • 让web 用户只能访问(读取),所需要的文件和路径。

4.2 避免其他漏洞

  • 不能有文件包含漏洞,目录遍历漏洞或其他漏洞。

4.3 限定文件的访问范围

  • 让用户不能访问Web 根目录以外的路径。

  • php.ini 配置文件中,可以通过选项open_basedir 来限定文件访问的范围

open_basedir = c:\www\

5.参考连接

https://github.com/lijiejie/ds_store_exp https://blog.csdn.net/GitChat/article/details/79014538 https://www.secpulse.com/archives/124398.html https://github.com/kost/dvcs-ripper https://github.com/lijiejie/GitHack http://www.vuln.cn/2225 https://g

你可能感兴趣的:(漏洞,安全)