一、目录遍历漏洞原理
目录遍历漏洞通过操纵引用带有“点-点-斜杠(…/)”序列及其变体的变量或使用绝对路径,攻击者可以读取运行在服务器上的任意文件,包括应用程序代码和数据、后端系统的凭据以及敏感的操作系统文件。在某些情况下,攻击者能够向服务器写入任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。
二、漏洞示例
<?php
$ template = 'red.php' ;
if (isset ($ _COOKIE [ 'TEMPLATE' ])) {
$ template = $ _COOKIE [ 'TEMPLATE' ];
}
?>
我们只要使用…/构造相对路径对文件进行遍历就可以达到攻击效果
… / … / … / … / … / … / … / … / … / etc / passwd
三、常见绕过
编码和双重编码:
%2e%2e%2f ../
%2e%2e/ ../
..%2f ../
%2e%2e%5c ..\
%2e%2e\ ..\
..%5c ..\
%252e%252e%255c ..\
..%255c ..\
百分比编码(又名URL编码)
Web容器对来自表单和URL的百分比编码值执行一级解码。
..%c0%af ../
..%c1%9c ..\
特定于操作系统
UNIX系统
常见的类Unix目录遍历使用该../模式。
Sudo是Unix中普遍存在的特权管理程序,
当用户使用glob通配符来指定允许用户运行哪些命令时
(例如chown /opt/myapp/myconfig/*可以被该命令利用),
它容易受到此攻击sudo chown baduser /opt/myapp/myconfig/../../../etc/passwd。
windows和DOS目录遍历使用../或者..\
每个分区都有一个单独的根目录(标记为C:\C可以是任何分区),
在该目录之上没有公共的根目录。
这意味着对于Windows上的大多数目录漏洞,攻击仅限于单个分区。
四、绕过防御示例
1、未进行任何防御
2、双写进行绕过
3、利用编码进行绕过
4、利用%00截断后缀绕过
5、利用文件路径绕过
五、漏洞防御
1、对用户的输入进行验证,特别是路径替代字符如“…/”和“~/”。
2、采用白名单的形式,验证所有的输入。
3、合理配置Web服务器的目录权限。
4、控制返回数据,保证返回数据不会泄露任何和服务器相关的隐私数据。
5、对用户传过来的文件名参数进行编码