任意⽂件读取、下载漏洞
⽂章⽬录
⼀、漏洞介绍
⽹站给⽤户提供了⽂件读取和下载的功能,但是没有对查看和下载功能做过多限制,未对⽤户输⼊的⽂件名作安全校验处理,导致⽤户可以查看和下载任意⽂件。
⽂件读取和下载在PHP和JAVA语⾔中尤为常见,主要出现在⽂件操作的功能点。
PHP中功能点:
file_get_contents()、readfile()、fread()、fgets()、fpassthru()、require()、require_once()、include()、include_once()
JAVA中功能点:
FileInputStream()、adAllLines()、adAllBytes()、RandomAccessFile()、ad()、adFileToString()
部分⽂件读取案例:
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=”www.a/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、 l
4、 .htaccess
5、
特殊的备份⽂件
1、 .swp
2、 .swo
3、 .bak
4、 index.php
下载apache
Windows系统常⽤系数
C:\boot.ini  //查看系统版本
C:\Windows\System32\l  //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/myf      //mysql的配置⽂件
/root/.mysql_history  //mysql的bash历史记录
/root/.wget-hsts
/opt/nginx/f  //nginx的配置⽂件
/var/www/html/index.html
/etc/f    //apache的配置⽂件
/etc/httpd/f  //httpd的配置⽂件
/
proc/self/fd/fd[0-9]*(⽂件标识符)
/proc/mounts    //查看系统上挂载的⽂件系统
/    //使⽤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、⽂件映射,存储和应⽤分离。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。