目录遍历漏洞
一、定义:
⽬录遍历Directory traversal(也称⽂件路径遍历、⽬录穿越、路径遍历、路径穿越)是⼀种允许攻击者在未授权的状态下读取应⽤服务上任意⽂件的安全漏洞。这包括应⽤代码、数据、凭证以及操作系统的敏感⽂件。在有些情况下,攻击者还可能对服务器⾥的⽂件进⾏任意写⼊,更改应⽤数据甚⾄完全控制服务器。
二、漏洞成因:
程序系统在实现上没有过滤⽤⼾输⼊的.../之类的⽬录跳转符,允许攻击者通过提交⽬录跳转符来遍历服务器上的任意⽂件。 ⽐如:http://www.test.com/index.php?file=image1.jpg 当服务器处理传送过来的image1.jpg⽂件名后,Web应⽤程序会⾃动添加完整的路径,eg://test/static/imgs/image1.jpg,
然后web系统将读取的内容返回给攻击者。 若对⽂件名称的安全性验证不⾜,攻击者会使⽤.../.../.../ect/passwd的⽂件名,将会导致访问⾮授权⽂件资源。
三、常见的目录跳转命令
windows:
- 根目录:
C: - 当前目录:
. - 当前用户目录:
C:\USERS - 跳转:
../
linux:
- 根目录:
/ - 当前目录:
. - 当前用户目录:
~ - 跳转:
../
四、基础绕过方法:
-
使用双写绕过,应对防御措施将".../"替换为空
http://www.test.com/index.php?file=../....//....//....//windows/win.ini -
加密型传递的参数
http://www.test.com/index.php?file=aW1hZ2UxLmpwZw==参数file的数据采⽤Base64加密,⽽攻击中只需要将数据进⾏相应的解密即可⼊侵,采⽤⼀些常⻅、规律性的加密⽅式也是不安全的。
-
编码绕过
采⽤不同的编码进⾏过滤型绕过,⽐如通过对参数进⾏url编码提交来绕过。
. => %2e/ => %2f% => %25(双重编码) 注意:服务器会先进⾏url解码,再加上get协议本⾝会进⾏⼀次url解码,所以进⾏两次url编码 -
目录限定绕过
有些web软件通过限定目录权限来分离,攻击者可以通过某些特定的符号来绕过。比如:根目录"/"被限定了权限,但是可以通过"~"来进入根目录下的目录
常见系统文件路径
Windows:
- C:\boot.ini //查看系统版本
- C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
- C:\Windows\System32\drivers\etc\hosts //本地DNS解析记录
- 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 #查看⽤⼾⽂件
-
/etc/shadow #查看密码⽂件,如果能读取该⽂件说明是root权限
-
/etc/httpd/conf/httpd.conf #查看apache的配置⽂件
-
/root/.bash_history #查看历史命令
-
/var/lib/mlocate/mlocate.db #本地所有⽂件信息
-
/etc/ssh/sshd_config #ssh配置⽂件,如果对外开放可看到端⼝
-
/proc/self/fd/fd0-9*(⽂件标识符)
-
/proc/mounts
-
/root/.ssh/known_hosts
程序配置文件
apache:
- /etc/httpd/conf/httpd.conf
- /etc/apache2/httpd.conf
- /etc/apache2/apache2.conf
nginx:
- /etc/nginx/nginx.conf
- /usr/local/nginx/conf/nginx.conf
- /usr/local/etc/bginx/nginx.conf
redis:
- /etc/redis.conf
五、防范方法
-
对传来的参数做过滤
需对用户提交的内容进行严格的过滤,这主要指过滤目录跳转符、字符截断符、dir命令等如".../"和"~/"
-
采用白名单的形式,验证所有的输入
也就是限制用户请求资源,对于少量文件(例如都是图像),写正则表达式批量规范请求资源的白名单
-
文件名参数统一编码,标准化所有字符
对用户传过来的文件名参数进行统一编码,将所有字符转换成URL编码,这样服务器不会解析成.../,对包含恶意字符或者空字符的参数进行拒绝
-
id随机数命名,持久化id:path数据库
文件路径保存至数据库,用户提交文件对应id访问数据库,路径识别拼接都在后端
-
下载文件前做权限判断,设置目录权限
控制返回数据,保证返回数据不会泄露任何和服务器相关的隐私数据
-
合理配置web服务器的目录权限
-
添加WAF规则