目录穿越及文件包含漏洞

目录穿越概念

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

目录穿越的漏洞危害

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

文件操作漏洞的分类

在这里插入图片描述

代码展示

先来简单展示一下目录穿越的原理,先在当前目录下新建一个file文件夹,里面建一个1.txt文件,内容随便,然后在上一级文件夹中建一个2.txt文件
demon1.php

<?php
    header("Content-Type:text/html;charset=utf-8");
    if(isset($_GET['file'])){
    
    
        readfile("file/".$_GET['file']);
    }

在这里插入图片描述
在这里插入图片描述
首先我们先来展示本地包含漏洞的效果,现在本地新建一个phpinfo.php文件

demon2.php

<?php
    $file = $_GET['name'];
    if(isset($file)){
    
    
        include ($file);
    }

phpinfo.php

<?php
    phpinfo();

在这里插入图片描述
然后将phpinfo移动到file文件夹中,目录穿越成功
在这里插入图片描述

目录穿越绕过方案

  1. 进行URL编码:点–>%2e 反斜杠–>%2f 正斜杠–>%5c
  2. 进行16为Unicode编码:点–>%u002e 反斜杠–>%u2215 正斜杠–>%u2216
  3. 进行双倍URL编码:点–>%252e 反斜杠–>%u252f 正斜杠–>%u255c
  4. 进行超长UTF-8 Unicode编码
  • 点–>%c0%2e %e0$40%ae %c0ae
  • 反斜杠–>%c0af %e0%80af %c0%af
  • 正斜杠–>%c0%5c %c0%80%5c

目录穿越修复方案

  1. 在URL内不要使用文件名称作为参数
  2. 检查使用者输入的文件名是否有“…”的目录阶层字符
  3. 在php.ini文件中设置open_basedir来指定文件的目录
  4. 使用realpath函数来展开文件路径中的“./”、 “…/”等字符,然后返回绝对路径名称
  5. 使用basename函数来返回不包含路径的文件名称

文件包含

文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包含漏洞。

本地包含

本地文件包含(Local File Include,LFI),LFI允许攻击者通过浏览器包含本机上的文件。当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在这个漏洞,该漏洞允许攻击者操纵输入数据、注入路径遍历字符、包含web服务器的其他文件。

远程包含

远程文件包含(Remote File Include,RFI), RFI允许攻击者包含远程文件,远程文件包含需要设置allow_url_include = On,四个文件都支持HTTP、FTP等协议,相对本地文件包含更容易利用,出现的频率没有本地包含多

代码仍然是使用demon2.php的代码

我们先尝试远程包含,这里使用一句话木马看看能不能成功实现目录穿越,这里我们写完后后缀保存为jpg格式

我们先修改php.ini文件中的allow_url_include中的值为On,然后重启phpstudy
在这里插入图片描述

这里我们使用菜刀连接,无论是本地包含还是远程包含,都能连接成功

远程包含
在这里插入图片描述
在这里插入图片描述
本地包含
在这里插入图片描述
在这里插入图片描述

文件包含挖掘思路

  • 模块加载、cache调用,传入的参数拼接包含路径
  • include()使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
  • inclue_once()功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
  • require()使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。
  • require_once()功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

本地包含利用方式

  • %00截断
  • 记录错误日志文件
  • 需要解密base64
  • 利用环境:php<5.3 magic_quotes_gpc取消的 可以使用遍历目录实现效果

远程包含利用方式

  • 包含文件时会加入默认后缀 比如包含1.jpg会解析成1.jpg.php
  • %00截断
  • 路径长度截断(linux-4096,windows-256)(不受GPC限制),5.3以后被修复,?name=…/…/…/…/…/…/…/…/…/www/1.php/././././././.[…]/./././././././././
  • 点号截断(只在window下可用),?name=…/…/…/…/…/…/…/…/…/boot.ini/………[…]…………
  • ? 伪截断,不受GPC和PHP版本限制(<5.2.8)
  • php://输入输出流(php://filter/read=convert.base64-encode/resource=1.txt 以base64编码截断)

文件包含修复方案

  1. 关闭远程包含参数开关,彻底切断这个业务相比较
  2. 设置类似白名单的方法,筛选固定文件名
  3. 常见目录穿越字符进行过滤,如(./ …/ …\等)

猜你喜欢

转载自blog.csdn.net/weixin_45007073/article/details/113466902