Preface

文件包含

在web后台开发中,会把一系列功能为了简便写到一个
function.php中,之后当某个文件需要调用的时候就直接在
在文件头写上一句<?php include function.php?>,就可以
直接调用函数代码。

通过include() 或者 require()语句,可以将PHP文件的内容
包含到另一个PHP文件(在服务器执行它之前)。

include和require语句是相同的,除了错误处理方面:
require会生成致命错误 (E_COMPILE_ERROR),并停止脚本
include只生成警告(E_WARNING), 并且脚本会继续

本地文件包含

通过参数过滤不严格 来包含本地的文件

通过包含本地的文件 可以读取任意文件

攻击手段可能会通过"…/…/…/…/"的方法来让后台打开
或者执行一些其他的文件。从而导致后台服务器
上其他目录的文件结果被遍历出来,形成目录遍历漏洞

远程文件包含

php.ini -> allow_url_include ON
php.ini -> magic_quotes_gpc OFF

能够通过url地址对远程的文件进行包含,
这意味着攻击者可以构造一个带有木马的服务器
让被攻击者web服务器包含过来 从而getshell等

Low

Source Code

<?php

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

?> 

Solution

首先题目是想让我们点击下面三个任意的文件的

在这里插入图片描述
当然我们是要进行文件包含的,然后根据源码提示,它没有对我们的输入进行任何过滤。

我们dvwa靶场的绝对路径为D:\phpStudy\PHPTutorial\WWW\dvwa

我们尝试进行包含dvwa文件夹下面的phpinfo文件

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../WWW/dvwa/phpinfo.php

这个payload的解析是这样的:首先页面先向上返回四级,即返回到127.0.0.1路径下,然后再访问其下面的WWW中的dvwa中的phpinfo文件

或者直接向上返回两级,直接访问phpinfo文件

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../phpinfo.php

我们可以添加多个../符号,来一直返回到D盘即我们的根目录,然后进行包含根目录下面的任意文件

Medium

Source Code

 <?php

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

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

Solution

我们可以看到源码对我们的输入进行了一些过滤,对于我们输入的http:// https:// ../ ..\全部替换为空,其实这个过滤其实只是限制了我们的远程包含并没有限制我们的本地包含,为什么说只是限制呢,因为对于替换为空的时候我们完全可以应用双写来进行绕过,我们下面掩饰几种方法。

0x00

我们首先用绝对路径进行包含,就可以不考虑双写了。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=D:\phpStudy\PHPTutorial\WWW\dvwa\phpinfo.php

在这里插入图片描述

0x01

我们进行双写绕过

因为../会被替换为空我们可以这样构造....//即可进行绕过

127.0.0.1/dvwa/vulnerabilities/fi/?page=....//....//phpinfo.php

0x02

我们进行远程文件包含的双写绕过

因为https://会被替换为空,同理我们可以进行双写绕过hhttps://ttps://

High

在开始的时候我们需要把php版本调高一些,比如我用的5.2.17,它会把fnmatch函数当做未定义
在这里插入图片描述

Source Code

<?php

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

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

fnmatch(pattern,string,flags) 函数根据指定的模式来匹配文件名或字符串。

pattern	必需。规定要检索的模式。
string	必需。规定要检查的字符串或文件。
flags	可选。

Solution

作者这次对我们的输出直接用函数来进行判断,如果输入不是file开头的文件或者主页的话那么会直接返回错误

但是我们可以采用file协议来进行文件包含。

所谓file协议,就是当我们用网页来打开一个本地文件的时候就是采用的file协议

在这里插入图片描述

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///D:\phpStudy\PHPTutorial\WWW\dvwa\phpinfo.php

在这里插入图片描述

Impossible

Source Code

<?php

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

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

Solution

作者这次直接用了白名单对我们的输入过滤,意思就是只要我们包含的文件不是include、file1、file2、file3那么就会直接报错。

所以我们彻底无法进行注入了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐