目录穿越

目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意的存取被限制的文件夹,执行命令或查找数据。目录穿越攻击,也与人称为Path Traversal攻击。

漏洞危害

攻击者可以使用目录穿越攻击来查找,执行或存取Web应用程序所在的根目录以外的文件夹。如果目录穿越攻击成功,黑客就可以执行破坏性的命令来攻击网站。

简单的目录穿越

1
2
3
4
5
<?php
if(isset($_GET['file'])){//判断我们传入的变量是否可控
echo readfile("file/" . $_GET['file']);//读取我们file文件夹下的文件并输出
}
?>

漏洞复现

源码中接收一个file参数,然后拼接到file后读取内容并输出,理论上只能读取file文件夹下的文件,当前我们加上../就能范围file文件夹的上级目录,../能叠加,直到返回到根目录。
我们在C盘根目录创建hello.txt文件,使用目录穿越来读取里面的内容,这样就能读取非web跟目录的文件。
payload:http://172.19.4.7/ds/readfile.php?file=../../../../../hello.txt

绕过过滤

  • 进行URL编码

  • 点=>%2e 反斜杠=>%2f 正斜杠=>%5c

  • 进行16位Unicode编码

  • 点=>%u002e 反斜杠=>%u2215 正斜杠=>%u2216

  • 进行两次URL编码

  • 点=>%252e 反斜杠=>%u252f 正斜杠=>%u255c

  • 进行超长UTF-8 Unicode编码

  • 点=>%c0%2e %e0$40%ae %c0ae

  • 反斜杠=>%c0af %e0%80af %c0%af

  • 正斜杠=>%c0%5c %c0%80%5c

加固方案

1:在URL内不要使用文件名称作为参数
2:检查使用者输入的文件名是否含有“..”的目录阶层字符。
3:在php.ini文件中设置open_basedir来指定文件的目录。
4:使用realpath函数来展开文件路径中的”./“ “../“等字符,然后返回绝对路径名称。
5:使用basename函数来返回不包含路径的文件名称。