任意文件读取
在web安全中,任意文件读取漏洞是非常常见的一种漏洞,属于文件操作类漏洞,一般常见于PHP/java/python语言中,任意文件读取漏洞,顾名思义,就是可以任意读取服务器上部分或者全部文件的漏洞,攻击者利用此漏洞可以读取服务器敏感文件如/etc/passwd,/etc/sadow,web.config。漏洞一般存在于文件下载参数,文件包含参数。主要是由于程序对传入的文件名或者文件路径没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露。
任意文件读取漏洞成因
任意文件读取漏洞的原理其实就是由于程序对客户端传入的参数未作合法性的检验造成的。
例如:
在业务常见中存在这样一个url: http://www.download.com/index.php?filename=code.php
此URL的业务功能主要是包含进code.php文件中的程序代码,然后在index.php文件中执行相关的代码,但是由于filename参数未作校验,攻击者可以构造url :
http://www.download.com/index.php?filename=c:windowswin.ini 或者构造
http://www.download.com/index.php?filename=/etc/shadow 然后去访问,结果攻击者就读取到了win.ini内容和操作系统shadow,操作系统的shadow文件是保存操作系统密码串的文件,这样攻击者就可以对密码串进行破解,获取到操作系统的SSH密码。
以上例子说明任意文件读取/下载的漏洞产生原理主要就是对参数未进行合法性校验造成的。另外还有一些如PHP语言的PHP流input和filter以及data的URLs远程文件包含漏洞造成的任意文件读取漏洞。
任意文件读取利用方式
任意文件读取/下载漏洞的利用方式比较简单,但也要看web系统的实际情况来读取下载文件。
- 对于weblogic中间件,如果攻击者想通过任意文件读取漏洞Getshell,那攻击者可以利用任意文件读取漏洞下载weblogic的密码文件和filter,然后破解console控制台密码,部署shell;
- 对于tomcat中间件,利用任意文件下载漏洞读取控制台密码文件tomcat-users.xml ,下载到管理台密码后就可以部署shell了
常见的任意文件下载/读取漏洞的利用方式有以下几种:
- 读取程序源代码(如密码配置文件)
- 读取程序配置文件(如数据库连接文件)
- 读取操作系统关键文件(如/etc/sadow,/root/.bash_history等文件)
- 读取运维配置文件(redis/rsync/ftp/ssh客户端数据等)
- 读取中间件配置文件(weblogic/tomcat等密码文件,apache的httpd.conf文件)
- 下载web日志文件(获取网站后台/上传文件等)
- 结合SSRF获取内网机器文件
实战测试
下面以DoraBox中的任意文件读取漏洞为例做漏洞的分析与演示:
分析:从源代码中可以看到如果对于读取的文件存在,那么直接将其内容输出即可,存在任意文件读取漏洞
利用:
只要知道路径就可以读取:
任意文件读取常用的路径:
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配置信息
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
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz