文章目录
- 一、漏洞介绍
- 二、漏洞危害
- 三、常见形式
- 1、任意文件读取
- 2、任意文件下载的方式
- 四、漏洞绕过
- 1、未进行任何防御
- 2、双写进行绕过
- 3、利用编码进行绕过
- 4、利用%00截断后缀绕过
- 5、利用文件路径绕过
- 五、常见的敏感文件
- 六、漏洞修复
一、漏洞介绍
网站给用户提供了文件读取和下载的功能,但是没有对查看和下载功能做过多限制,未对用户输入的文件名作安全校验处理,导致用户可以查看和下载任意文件。
文件读取和下载在PHP和JAVA语⾔中尤为常见,主要出现在文件操作的功能点。
PHP中功能点:
file_get_contents() 、readfile() 、fread() 、fgets() 、fpassthru() 、require()、 require_once() 、include()、include_once()
JAVA中功能点:
java.io.FileInputStream() 、java.nio.file.Files.readAllLines() 、java.nio.file.Files.readAllBytes() 、java.io.RandomAccessFile() 、java.nio.channels.AsynchronousFileChannel.read() 、org.apache.commons.io.FileUtils.readFileToString()
部分文件读取案例:
1、Elasticsearch任意文件读取(CVE-2015-3337)
2、GitLab 任意文件读取(CVE-2016-9086)
3、Node.js任意文件读取(CVE-2017-14849)
4、Weblogic任意文件读取(CVE-2019-2615)
5、Spring Cloud Config Server任意文件读取(CVE-2019-3799)
二、漏洞危害
1、可以读取或者下载服务器的配置文件,脚本文件
2、读取或者下载数据库的配置文件
3、读取网站源码文件,进行代码审计
4、对内网的信息进行探测等。
三、常见形式
1、任意文件读取
<?php
$filename=”1.txt”;
readfile($filename);
?>
<?php
$filename=”1.txt”;
echo file_get_contents($filename);
?>
这两段代码有一个共同点是:$filename
是没有经过任何校验的,用户可以控制$filename
读取任何文件。
2、任意文件下载的方式
2.1、直接下载
<a href=”http://www.a.com/xxx.rar”>下载</a>
以get形式通过a标签直接对文件进行下载,但是没有对下载的文件做任何限制。
2.2、header头
<?php
$filename = $_GET['filename'];
echo '<h1>开始下载文件!</h1><br /><br />';
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>
以post方式直接对文件下载,也是没有进行校验
四、漏洞绕过
1、未进行任何防御
2、双写进行绕过
3、利用编码进行绕过
4、利用%00截断后缀绕过
5、利用文件路径绕过
五、常见的敏感文件
用户目录下的敏感文件
1、 .bash_history
2、 .zsh_history
3、 .profile
4、 .bashrc
5、 .gitconfig
6、 .viminfo
7、 passwd
应用的日志文件
1、 /var/log/apache2/access.log
2、 /var/log/nginx/access.log
站点目录下的敏感文件
1、 .svn/entries
2、 .git/HEAD
3、 WEB-INF/web.xml
4、 .htaccess
5、 robots.txt
特殊的备份文件
1、 .swp
2、 .swo
3、 .bak
4、 index.php
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系统常用系数
/etc/passwd //存储一般的用户信息,任何人都可以访问
格式: root:x:0:0:root:/root:/bin/bash
/etc/shadow //存储用户的密码信息,只有root用户可以访问
格式:root:$6$Fsf6Q6SH$MlagWih0lcGFxtAo7/s8Z5.wywJyCqH6qateZ6yPFOPm8bNYTGAEPygZxSOPR1A9Rtw.WxJp2fNMOoeB1wj890:17524:0:99999:7:::
/etc/hosts //包含了ip地址和主机名之间的映射
/root/.bash_history //root的bash历史记录
/root/.ssh/authorized_keys //记录每个访问计算机用户的公钥
/etc/my.cnf //mysql的配置文件
/root/.mysql_history //mysql的bash历史记录
/root/.wget-hsts
/opt/nginx/conf/nginx.conf //nginx的配置文件
/var/www/html/index.html
/etc/apache2/apache2.conf //apache的配置文件
/etc/httpd/conf/httpd.conf //httpd的配置文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //查看系统上挂载的文件系统
/porc/config.gz //使用gzip压缩的当前的 Linux 内核配置文件
/proc/sched_debug // 提供cpu上正在运行的进程信息,可以获得进程的pid号,可以配合后面需要pid的利用
/proc/mounts // 挂载的文件系统列表
/proc/net/arp //arp表,可以获得内网其他机器的地址
/proc/net/route //路由表信息
/proc/net/tcp and /proc/net/udp // 活动连接的信息
/proc/net/fib_trie // 路由缓存
/proc/version // 内核版本
/proc/[PID]/cmdline // 可能包含有用的路径信息
/proc/[PID]/environ // 程序运行的环境变量信息,可以用来包含getshell
/proc/[PID]/cwd // 当前进程的工作目录
/proc/[PID]/fd/[#] // 访问file descriptors,某写情况可以读取到进程正在使用的文件,比如access.log
/var/log/cron // 查看crontab的相关信息
/var/log/lastlog //记录系统上所以账号最近一次的登录情况
ssh相关文件信息
/root/.ssh/id_rsa //ssh私钥信息
/root/.ssh/id_rsa.pub //ssh公钥信息
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进
/etc/ssh/sshd_config //ssh配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0 //etho信息
/etc/syscomfig/network-scripts/ifcfg-eth1 //eth1信息
/var/log/secure //只要牵涉到『需要输入帐号口令』的软件,那么当登陆时 (不管登陆正确或错误) 都会被记录在此文件中(包含ssh的登录记录)
不同的系统配置文件不太一样,需要根据系统的网络架构去查找相关的配置文件。
六、漏洞修复
1、对用户输入的参数进行校验;
2、限定用户访问的文件范围;
3、使用白名单;
4、过滤…/,防止用户进行目录遍历;
5、文件映射,存储和应用分离。