任意文件读取与下载漏洞学习

原理:

任意文件读取漏洞属于文件操作类漏洞,一般常见于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:\windows\win.ini 或者构造http://www.download.com/index.php?filename=/etc/shadow ,然后去访问,结果攻击者就读取到了win.ini内容和操作系统shadow,对于操作系统的shadow文件,大家应该比较清楚,是保存操作系统密码串的文件,这样攻击者就可以对密码串进行破解,获取到操作系统的SSH密码。

产生的原因:

1.存读取文件的函数

2.读取文件的路径用户可控,并且未校验或者校验不严

3.输出了文件内容

危害:

  通过任意文件读取/下载,可以读取/下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息等

任意文件读取

<?php            

$filename=”test.txt”;

readfile($filename);

?>

<?php

$filename=”test.txt”;

Echo fiile_get_contents($filename);

?>

文件读取函数:readfile()、file_get_contents()、fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd、./index.php。

文件下载

      ·<a href=”http://www.a.com/ccc.rar”>下载</a>

在上述代码中,$filename 没有经过校验,或者校验不合格,用户可以控制这个变量读取任意的文件,比如/etc/passwd、../index.php等等。这样就造成了任意文件下载漏洞

利用方式:

  任意文件读取/下载漏洞的利用方式比较简单,但也要看web系统的实际情况来读取下载文件,对于weblogic中间件,如果攻击者想通过任意文件读取漏洞Getshell,那攻击者可以利用任意文件读取漏洞下载weblogic的密码文件和filter,然后破解console控制台密码,部署shell;对于tomcat中间件,利用任意文件下载漏洞读取控制台密码文件tomcat-users.xml ,下载到管理台密码后就可以部署shell了,总之,任意文件下载漏洞的利用方式要看实际情况,下载文件一般利用有:配置文件读取,代码审计,信息收集,getshell等,常见的任意文件下载/读取漏洞的利用方式有以下几种:

1. 读取程序源代码(如密码配置文件)

2. 读取程序配置文件(如数据库连接文件)

3. 读取操作系统关键文件(如/etc/sadow,/root/.bash_history等文件)

4. 读取运维配置文件(redis/rsync/ftp/ssh客户端数据等)

5. 读取中间件配置文件(weblogic/tomcat等密码文件,apache的httpd.conf文件)

6. 下载web日志文件(获取网站后台/上传文件等)

7. 结合SSRF获取内网机器文件

技巧:任意文件读取漏洞的挖掘一般只能手工进行测试,常见的web扫描器很难发现此类漏洞,主要因为任意文件读取漏洞大多数在登录状态的各种业务场景下面,甚至出现在APP类的程序中,所以此类漏洞只能根据业务场景,参数名称等方式进行手工测试。对于任意文件下载漏洞的payload构造,情况比较多,最为常见的payload类似于../../../../../../这样的通道符,当然还有一些程序做了限制的,如%00截断,路径长度截断,点号截断等。常见的任意文件读取漏洞挖机有以下几种:

漏洞挖掘:手动挖掘从连接和参数名查看

连接:readfile.php?file=**.txt、download.php?file=**.rar

参数名:&readpath=、&filepath=、&path=、&inputfile=、&url=、&data=、&readfile=、&menu=、META-INF= 、WEB-INF

漏洞验证

      • Index.php?f=../../../../../../../../etc/passwd

      • Index.php?f=../index.php

      • Index.php?f=file:///etc/passwd

     参数f的参数值为PHP文件时:

      1.文件被解析,则是文件包含漏洞

      2.显示源代码,则是文件查看漏洞

      3.提示下载,则是文件下载漏洞

白盒:

任意文件挖掘通过代码审计的方式挖掘,此类挖掘漏洞的方式我们可以搜索关键词,如download,filename,file,name,dir等与文件操作相关的代码段,然后找出对应的处理函数看是否做了过滤和限制等。白盒审计任意文件读取的漏洞我们就不需要每一行代码都去看,既然审计目的是找出是否有文件读取和文件下载的漏洞,那么只要找出相关的业务功能代码即可进行挖掘。这里白盒审计的敏感字段常见有RealPath,FilePath,filepath,Path,path,inputFile,url,urls,Lang,dis,data,readfile,filep,src,menu,file,name,filename,input等

黑盒:

黑盒挖掘任意文件下载的漏洞其实就是渗透测试了,黑盒相对于白盒审计而言,就是看不到代码段,不知道程序对文件名参数是否做了处理,那么就需要通过各种文件读取的payload fuzz了。黑盒挖掘文件下载读取漏洞,在web业务上面我们可以寻找文件的下载点,图片加载点,路径写入点等,如/getpiptureActionload.action?filename=xxxxx.docx&random=111,那么我们在测试的时候就可以构造:getpiptureActionload.action?filename=../../../../../../../../../.etc/passwd&random=111这样的url进行漏洞挖掘,当然不同的操作系统,构造方式有所不同。

 

重要文件位置:

操作系统常用函数

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

`.bash_history` # 历史中可能带着用户的密码 (遇到过现实案例,是输错的情况下参数的,比如没输入 su 却以为自己输了 su)

/etc/passwd # 用户情况

/etc/shadow # 直接 John the Ripper

/etc/hosts # 主机信息,通常配置了一些内网域名

/root/.bash_history //root的bash历史记录

/root/.ssh/authorized_keys

/root/.mysql_history //mysql的bash历史记录

/root/.wget-hsts

/opt/nginx/conf/nginx.conf //nginx的配置文件

/var/www/html/index.html

/etc/my.cnf

/etc/httpd/conf/httpd.conf //httpd的配置文件

/proc/self/fd/fd[0-9]*(文件标识符)

/proc/mounts

/porc/config.gz

/proc/sched_debug // 提供cpu上正在运行的进程信息,可以获得进程的pid号,可以配合后面需要pid的利用

/proc/mounts // 挂载的文件系统列表

/proc/net/arp //arp表,可以获得内网其他机器的地址

/proc/net/route //路由表信息

xml # tomcat 用户配置文件

/root/.bashrc # 环境变量

/root/.bash_history # 还有root外的其他用户

/root/.viminfo # vim 信息

/root/.ssh/id_rsa # 拿私钥直接ssh

/proc/xxxx/cmdline # 进程状态枚举 xxxx 可

以为0000-9999 使用burpsuite

数据库 config 文件

web 日志 access.log, error.log

/var/lib/php/sess_PHPSESSID # 非常规问题 session 文件

/proc/net/arp

/proc/net/tcp

/proc/net/udp

/proc/net/dev

常见的网络架构

jsp

尝试下载tomcat-users.xml文件,里面保存了管理Tomcat的账号密码,该文件在:Tomcat安装目录/conf/tomcat-users.xml,下载该文件之后,就能获取管理员账号密码,然后登陆管理后台,部署带有木马文件的war包。

aspx

aspx站点一般后台都是SQL Server数据库,因此利用该漏洞的最简单的方法是下载网站根目录下的web.config文件,该文件中一般含有数据库的用户名和密码。

asp

一般的asp站点都是Access数据库,而Access数据库可以直接下载,因此利用该漏洞比较简便的方法就是直接下载Access数据库,找到管理员密码登陆后台,利用后台的上传功能,上传shell。首先目的是找到数据库文件名以及存放的

路径。找到网站与数据库操作的动态页面,动态页面中一般使用include包含连接数据库的配置文件。一般网站的管理后台页面会包含这个信息,所以可以使用任意文件下载漏洞下载管理后台页面,例如admin.asp/mamage.asp等。在这些文件中一般会写有数据库文件的路径以及文件名。直接下载数据库文件可能下载不了,因为管理员一般会做限制,禁止直接下载mdb文件,可以使用任意文件下载漏洞来下载数据库文件。

php

php一般是使用MySQL数据库, 一般MySQL数据库禁止远程连接,但是可以使用phpMyAdmin进行管理。同意,尝试下载数据库连接文件,conf/config.php等等,获取数据库账户密码之后,如果是root权限,在知道网站绝对路径的情况下,尝试直接写入一句话木马。

 

Google Hacking:

限定文件访问范围

inurl:"download.php?file="

inurl:"read.php?filename="

inurl:"down.php?file="

心得:

主体思路

尝试读取敏感文件以获取尽可能多的信息。例如, /etc/issue 可以确认 Linux 主机的发行版。其中 .bash_history, ssh相关路径 中可能含有大量敏感信息。获取到 /etc/shadow 则可以直接使用 John The Ripper 尝试枚举 root 密码。比如Tomcat 控制台可读取用户密码 /usr/local/tomcat/conf/tomcat-users.xml。

思路

1.一定要确认是否具有root权限,这个很重要,不然很多文件还是因为权限问题没法被读取,/root/目录下的都没法读取

2.要是没遇到root权限的漏洞,也不用直接放弃,可以换用其他姿势,选用代码审计的方法,主要查看数据库的配置文件

3,找到数据库的配置文件后如果是mysql,配置的是localhost,那可以查看是否含有phpmyadmin软件,要是没有推荐继续代码审计,可能会比较耗时间,不过肯定会有所收获。

4.配合burp使用效果与效率最高。

例如:有了 .bash_history后,就可以开始审计操作记录了,首先我们要确定一个东西,那就是任何终端输入的东西,都会被记录到 .bash_history中,比如 mysql-u root-p123456这样一来,我们就相当于直接获取到了mysql的账号密码

除此之外,通过用户history,我们还可以下载到所有的例如网站备份脚本,网站备份文件,调用其他网站的api key 和 api id

如果存在备份脚本的话,还可通过审计脚本,逆推着写一个脚本来下载备份数据库文件,贴一张我漏洞报告中的记录

下载到 mysql_backup.sh后,进行审计,然后写出脚本获取备份文件

总结

我最常用的其实就是,跟着管理员的操作来进行文件读取,因为有的网站是直接外面写好后,传入里面解压后,才部署的网站,如果管理员没删除部署文件的话,直接整站下载

在针对登录的页面,进行审计绕过,也不失为一种方式,但是我还是偏向于,读取备份文件、网站脚本、网站配置文件

防御

1.php.ini 配置 open_basedir限定文件访问范围

2.用户输入配置白名单

3.不允许包含 ../,过滤.

 

绕过:

1.若过滤字符或字母可尝试编码绕过

2.利用 ../../

but有些代码会进行过滤(具体要根据代码进行测试),会把 ../ 置空
利用....// 代替 ../
利用..// 代替 /

具体怎么绕过还是得看代码是怎么写的
3.注意
①.注意 ../ 的数量,他代表查询目录父目录的数量
②.当我们遇到一个任意文件下载漏洞时首先要注意下载的权限问题。因为权限决定我们能下载的文件范围。
③.有些网站(主要是针对系统)并不会在URL里显示给你看,这时候你需要抓包,从数据包里修改路径,达到任意文件读取。

猜你喜欢

转载自blog.csdn.net/weixin_40602516/article/details/113098861