目录遍历目录遍历(英文:Directory traversal),又名路径遍历(英文:Path traversal)是一种利用网站的安全验证缺陷或用户请求验证缺陷(如传递特定字符串至文件应用程序接口)来列出服务器目录的漏洞利用方式。 此攻击手段的目的是利用存在缺陷的应用程序来获得目标文件系统上的非授权访问权限。与利用程序漏洞的手段相比,这一手段缺乏安全性(因为程序运行逻辑正确)。 目录遍历在英文世界里又名 示例下方是一个存在安全隐患的PHP程序示例: <?php
$template = 'red.php';
if (isset($_COOKIE['TEMPLATE']))
$template = $_COOKIE['TEMPLATE'];
include ("/home/users/phpguru/templates/" . $template);
?>
攻击者可对此程序发送下列HTTP请求: GET /vulnerable.php HTTP/1.0
Cookie: TEMPLATE=../../../../../../../../../etc/passwd
从而使服务器产生如下的响应: HTTP/1.0 200 OK
Content-Type: text/html
Server: Apache
root:fi3sED95ibqR6:0:1:System Operator:/:/bin/ksh
daemon:*:1:1::/tmp:
phpguru:f8fk3j1OIf31.:182:100:Developer:/home/users/phpguru/:/bin/csh
Unix中的 新版Unix操作系统中,原位于passwd文件中的经散列处理后的密码被移动到了 变体下方是已知的目录遍历攻击方式变体: Unix上的目录遍历常见的Unix类目录遍历攻击使用 Windows上的目录遍历对微软Windows及DOS进行目录遍历通常使用 在这类系统上,每个分区均有不同的根目录(如C盘则为 这种攻击手段也是此类系统上大多数安全缺陷的异派同源。[2][3] URI编码目录遍历此缺陷与规范化问题有关。 部分网页应用程序会检查查询字符串中的危险字符,如:
这种方法能避免部分目录遍历问题。但是,查询字符串在使用前通常经过URI解码。因此,这些应用程序易受到百分号编码类的目录遍历攻击,如:
Unicode / UTF-8编码目录遍历同样与规范化问题有关。 布魯斯·施奈爾与杰弗里·斯特里夫林(Jeffrey Streifling)称UTF-8是安全缺陷与攻击向量的根源。[4] 当微软为其网页服务器添加Unicode支持时,同时添加了一种编码 多个百分号编码,如:
可被解码为 微软的网页服务器将百分号编码解码为对应的8位字符。这是Windows和DOS的正确行为,因为两者都使用基于ASCII的8位字符集的规范形式。 但是,原版UTF-8并不是规范形式,多个字符串经编码后可被译为相同的字符串。微软在未经UTF-8规范化时即进行防遍历检查,从而导致在字符串比较时忽略了(HEX) Zip/压缩文件遍历攻击攻击者可使用归档文件(如zip格式)来进行目录遍历攻击:压缩文件中的文件可为攻击者精心制造,利用回溯法来覆盖文件系统上的文件。用于解压缩归档文件的代码应对归档中的文件进行检查,避免目录遍历。 防止目录遍历的方法下方是防止目录遍历的几种方法:
<?php
include($_GET['file'] . '.html');
用户可使用空字符(表示字符串结束)来绕过 另请参阅参考文献
其他资源
外部链接 |