美文网首页
01-2目录遍历

01-2目录遍历

作者: 测试有话说 | 来源:发表于2021-06-16 20:50 被阅读0次

    一、漏洞描述

    攻击者能够在web应用程序所在的根目录以外的文件夹上,任意地获取数据

    二、攻击场景及形成原因

    攻击场景

    常见于展示系统配置信息等场景,该场景下需要通过文件名参数来获取对应配置文件的这类功能设计。

    形成原因

    没有过滤用户输入的../和./之类的目录跳转符

    image.jpeg

    三、危害性

    攻击者能够获取敏感数据,继而攻陷整个服务器。例如获取linux下的/etc/passwd文件后可能会破解出root用户的密码等。

    四、攻击案例

    某应用程序后台脚本中包含如下loader.php文件:

    
    if(isset($_GET[‘js’]))
    
    {
    
        $js = explode(‘;’, $_GET[‘js’]);
    
        foreach($js as $val)
    
        {
    
            $ext = substr($val,strrpos($val,’.’)+1);
    
            If($ext == ‘js’ || $ext==’css’)
    
            {
    
                if(is_file($val))
    
                {
    
                    echo file_get_contents($val);
    
                    echo “\n”;
    
                }
    
            }
    
        }
    
    }
    
    

    该页面没有对用户提交的js参数的文件路径进行过滤,攻击者可通过目录跳转字符“../”进行目录遍历攻击。虽然程序将读取的文件类型限制为“js”和“css”,但是由于PHP 5.3.4之前的版本中存在空字符截断漏洞,同时程序也未对截断符“%00”进行过滤,攻击者可借助截断符读取任意类型文件。构造如下参数即可访问linux服务器下的/etc/passwd文件。

    http://vulhost/loader.php?js=../../../../../../../etc/passwd%00.js

    五、漏洞评级及处理

    等级:严重

    给出安全漏洞警告,12小时内必须进行修复。未修复漏洞之前禁止对外发布。

    六、防御方法

    使用相应的函数把特殊的字符(.、/、%等)给过滤掉

    
    <?php
    
    if(isset($_GET["file"]))
    
       {
    
           $file = $_GET["file"];
    
           //
    
          if(sizeof(explode("..",$file)) >1 || sizeof(explode("./", $file))>1 || sizeof(explode(".\\", $file))>1)
    
          {
    
              //正常文件名不会有两个以上的.
    
              echo "filename error";
    
          }
    
          else
    
          {
    
              $ext = substr($file,strrpos($file,".")+1);
    
              //通常文件下载会在这里加入文件后缀的判断
    
              if(is_file($file))
    
                  {
    
                    //$file_type = mime_content_type($val);
    
                    header("Content-Type:".$ext);
    
                    echo file_GET_contents($file);
    
                    //echo "<br>";
    
                  }
    
          }
    
       }
    
    ?>
    

    七、测试方法

    如demo为以下代码

    
    if(isset($_GET["file"]))
    
       {
    
           $file = $_GET["file"];
    
           $ext = substr($file,strrpos($file,".")+1);
    
           //通常文件下载会在这里加入文件后缀的判断
    
           if(is_file($file))
    
                    header("Content-Type:".$ext);
    
                    echo file_GET_contents($file);
    
            }     
    
       }
    
    

    使用../../../../../etc/passwd 或针对windows系统使用 ../../../../../跳转至一个确定存在文件的路径,若展示目录内容,或对应目录结构内容,即存在目录遍历问题。

    若提示错误或显示空白内容,则不存在目录遍历风险。

    相关文章

      网友评论

          本文标题:01-2目录遍历

          本文链接:https://www.haomeiwen.com/subject/fqktyltx.html