任意文件读取、下载漏洞

本文阅读 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、未进行任何防御

img img

2、双写进行绕过

img

3、利用编码进行绕过

img

4、利用%00截断后缀绕过

img

5、利用文件路径绕过

img

用户目录下的敏感文件
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、文件映射,存储和应用分离。

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/sycamorelg/article/details/111592282
-- 展开阅读全文 --
Web安全—逻辑越权漏洞(BAC)
« 上一篇 03-13
Redis底层数据结构--简单动态字符串
下一篇 » 04-10

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复