01
漏洞简述
任意文件读取漏洞(Arbitrary File Read Vulnerability)是一种安全漏洞,允许攻击者读取服务器上的任意文件,包括敏感文件和配置文件。这种漏洞通常出现在应用程序对用户输入的处理不当的情况下。
攻击者可以通过构造恶意请求,利用漏洞中的代码逻辑缺陷或错误配置,绕过访问控制并读取服务器上的文件。这可能导致敏感信息泄露、系统被进一步攻击或其他安全风险。
文件读取的函数都有哪些?
file,file_get_contents(),fopen(),reafile(),fread(),fgetss(), fgets(),parse_ini_file(),showsource(),hightlight_file()等
02
漏洞原理
在一些文件下载以及浏览的功能点中存在一些文件读取的函数(如:readfile、file_get_contents等函数),且参数中的文件名或者路径可以由用于控制且关键字符未能进行有效的过滤就会造成任意文件读取。其原因总结如下:
1. 不正确的输入验证:应用程序未正确验证用户提供的文件路径或文件名,导致攻击者可以通过修改输入来读取其他文件。
2. 目录遍历漏洞:应用程序在处理文件路径时未正确过滤或限制用户输入,使得攻击者可以使用特殊字符或路径跳转序列(如"../")来遍历目录并读取任意文件。
3. 弱授权或访问控制:应用程序对文件或目录的权限设置不正确,攻击者可以利用这些弱点读取他们本应无权访问的文件。
2.1 任意文件读取危害
1、如果读取路径没有限制则可读取系统下任意敏感文件,如数据库账号密码,后台账号密码等等。
2、通过任意文件读取将后端源码全部读取用来进行代码审计,找到更有利用价值的漏洞。
3、通过收集敏感信息与其他漏洞进行配置利用造成更大的危害。
2.2 文件读取和文件下载区别
我们通过如下代码就可以清楚的发现区别:在进行文件下载之前,通过需要设置适当的响应头信息,可控制浏览器将文件视为下载内容还是显示内容。
文件读取:
<?php
if (isset($_GET['filename'])){
$filename = $_GET['filename'];
// header("Content-Type:text/html; charset=utf-8");
header('Content-Type: text/plain; charset=utf-8');
echo readfile($filename);
}else{
highlight_file(__FILE__);
}
?>
header('Content-Type: application/pdf');
文件下载:
header('Content-Type: application/octet-stream');
在上述代码中,header()函数用于设置响应头信息,指定文件的内容类型、文件名和文件大小。然后使用readfile()函数将文件内容发送到输出缓冲区,以便将其发送到浏览器进行下载。
2.3 文件读取常用函数
当涉及到文件读取时,以下是更多可用于读取文件相关的函数:
1. file_get_contents():将整个文件内容读取到一个字符串中。
2. fopen() 和 fclose():用于打开和关闭文件句柄,提供更底层的文件操作功能。
3. fgets():逐行读取文件内容,每次读取一行。
4. fgetss():逐行读取文件内容,并过滤掉 HTML 和 PHP 标记。
5. fread():按指定字节数读取文件内容。
6. readfile():将文件内容直接输出到输出缓冲区。
7. file():将整个文件读取到数组中,每行作为数组的一个元素。
8. parse_ini_file():解析 INI 文件并返回配置项和值的关联数组。
9. show_source():将指定文件的源代码输出到浏览器。
10. highlight_file():将指定文件的源代码以 HTML 格式高亮显示。
11. fgetc():逐个字符读取文件内容。
12. fgetcsv():逐行读取 CSV 文件内容,并将每行数据解析为数组。
13. file_exists():检查文件是否存在。
14. is_file():检查给定路径是否是一个文件。
15. is_dir():检查给定路径是否是一个目录。
16. basename():获取文件的基本名称(不包含路径)。
17. dirname():获取文件路径中的目录部分。
18. realpath():获取文件的真实路径。
19. glob():根据通配符模式获取匹配的文件列表。
20. scandir():获取目录中的文件和目录列表。
21. filemtime():获取文件的修改时间。
22. filesize():获取文件的大小。
23. pathinfo():获取文件路径的信息,如目录名、文件名、扩展名等。
24. fileatime():获取文件的访问时间。
1、readfile()
2、file_get_contents()
3、fopen() + fread() + fclose()
Fopen 返回的 只是resouce对象,还需要fread 函数去读取内容,然后还需要fclose函数去关闭fopen 打开的文件。
4、File()
使用 file() 函数读取文件的内容,它将返回一个包含文件每行内容的数组。
接下来,通过遍历文件内容数组,可以逐行输出文件内容或进行其他处理。
请确保在使用 file() 函数时,文件的路径是正确的,并且您有足够的权限来读取该文件。另外,请注意,file() 函数将整个文件内容加载到内存中,适用于较小的文件。对于大型文件,可能需要使用逐行读取的方式,以减少内存占用。
5、Fopen()+fgets()/fgetss()
在上述代码中,首先使用 fopen() 函数打开文件,并将文件句柄存储在 $file 变量中。第二个参数 'r' 表示以只读模式打开文件。
然后,使用 fgets() 函数在循环中逐行读取文件内容,直到文件的末尾。
最后,使用 fclose() 函数关闭文件句柄,释放资源。
6、Fopen+fgetc()
该函数与fegts 类似,只是这个是逐个读取字符
使用
fgetc() 函数在循环中逐个字符地读取文件内容,直到文件的末尾。每次循环,
fgetc() 函数会返回文件中的下一个字符,并将其存储在
$file 变量中。如果已到达文件末尾,
fgetc() 将返回
false,循环结束。最后,使用
fclose() 函数关闭文件句柄,释放资源。
7、Fopen() + fgetcsv()
8、parse_ini_file()
9、show_source()
10、highlight_file()
03
漏洞利用
文件读取漏洞可能导致攻击者读取系统上的敏感文件或包含敏感信息的文件。以下是一些常见的文件读取漏洞利用方式:
1. 路径遍历:通过构造恶意请求,绕过文件路径限制,访问系统上的其他文件或目录。
2. NULL 字节绕过:攻击者利用空字节(�)绕过文件名检查,读取位于 NULL 字节之前的文件路径。
3. 相对绝对路径:使用相对路径绝对构造恶意请求,访问系统上的其他文件或目录。
4. 特殊协议:某些文件读取函数支持特殊的协议(如 "file://"),可以利用这些协议来读取远程文件或特殊文件。
5. 用户输入未经验证:如果应用程序没有正确验证用户输入的文件路径或文件名,可以构造恶意输入来读取系统上的敏感文件。
6. 配置文件泄露:尝试读取配置文件,以获取敏感信息(如数据库凭据、API 密钥等)。
7. 日志文件读取:尝试读取日志文件,以查找敏感信息或了解系统的运行状况。
3.1 任意文件读取利用思路
1、一般拿到一个任意文件读取得先判断权限大不大,如果权限够大的话可以直接先把/etc/sadow读下来,权限不够就读/etc/passwd,先把用户确定下来,方便后续操作
2、读取各个用户的.bash_history能翻有用的信息,如编辑一些敏感文件
3、读取程序配置文件(如数据库连接文件,可以利用数据库写shell)
4、读取中间件配置文件(weblogic/tomcat/apache的密码文件、配置文件,确定绝对路径,方便后面读源码)
5、读取一些软件的运维配置文件(redis/rsync/ftp/ssh等等程序的数据、配置、文档记录)
6、读取程序源代码,方便后面做代码审计,找突破口
7、读取web应用日志文件,中间件的日志文件,其他程序的日志,系统日志等(可以网站后台地址、api接口、备份、等等敏感信息)
8、还有就是可以用字典先跑一波,信息收集还是要全面点。
3.2 任意文件读取常见参数名:
&RealPath=
&FilePath=
&file=
&filename=
&Path=
&path=
&inputFile=
&url=
&urls=
&Lang=
&dis=
&data=
&readfile=
&filep=
&src=
&menu=
&META-INF=
&WEB-INF=
3.3 任意文件读取常用敏感文件路径:
windows常见的敏感文件路径:
C:boot.ini //查看系统版本
C:WindowsSystem32inetsrvMetaBase.xml //IIS配置文件
C:Windowsrepairsam //存储系统初次安装的密码
C:Program Filesmysqlmy.ini //Mysql配置
C:Program Filesmysqldatamysqluser.MYD //Mysql root
C:Windowsphp.ini //php配置信息
C:Windowsmy.ini //Mysql配置信息
C:Windowswin.ini //Windows系统的一个基本系统配置文件
Linux常见的敏感文件路径:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
程序的配置文件
apache:
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
nginx:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/etc/nginx/nginx.conf
/etc/nginx/nginx.conf
/var/www/html
/usr/local /services/nginx -1.6 .2 /logs/access.log
/usr/local /services/nginx -1.6 .2 /logs/error.log
/usr/local /services/nginx -1.6 .2/nginx.conf
/usr/local /services/nginx -1.6 .2 /conf/nginx.conf
/usr/local /services/nginx -1.6 .2 /conf/proxy.conf
/usr/local /services/nginx -1.6 .2 /conf/extra/haolaiyao.conf
redis:
/etc/redis.conf
SSH:
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
/root/.ssh/authorized_keys
/etc/ssh/sshd_config
/var/log/secure
resin:
/usr/local /services/resin -4.0 .44/
/usr/local /services/resin -4.0 .44 /conf/resin.xml
/usr/local /services/resin -4.0 .44 /conf/resin.properties
jetty:
/usr/local /services/jetty -8.1 .16/
/usr/local /services/jetty -8.1 .16 /logs/stderrout.log
/usr/local /services/jetty -8.1 .16 /etc/jetty.xml
tomcat:
/usr/local /services/apache-tomcat -8.0 .23/logs
/usr/local /services/apache-tomcat -8.0 .23 /logs/catalina.out
svn:
/ home/svnroot/
上面只是一小部分,实战中可以根据实际情况针对性的读取或者使用字典去遍历,如seclist里面的字典等
End
原文始发于微信公众号(贝雷帽SEC):WEB 安全—深入学习文件读取漏洞 (一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论