【文件包含漏洞-01】文件包含概述及实例——以PHP语言为例

1 文件包含

定义:程序开发人员通常会把可重复使用的代码写到单个文件中,在使用该重复代码时,直接调用此文件,无需多次编写,这种调用文件的过程称为文件包含
普适性:几乎所有脚本语言都会提供文件包含功能,本文主要以PHP语言为例进行介绍。

2 文件包含语句-以PHP语言为例

2.1 文件包含语句简介

函数用法差异
include()文件包含失败时,会产生警告,脚本继续运行
include_once()与include()功能相同,文件只会被包含一次
require()文件包含失败时,会产生错误,直接结束脚本运行
require_once()与require()功能相同,文件只会被执行一次

2.2 文件包含语句测试实例

2.2.1 测试环境

(1)本文实验基于WAMP环境进行测试,环境部署过程参考文章《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》。
(2)在该环境网站根目录下,新建文件夹FileInclusion,在FileInclusion文件夹下新建以下文件进行实验。
(3)直接使用win2008虚拟机上的浏览器来访问不同函数的执行效果。

2.2.2 被包含文件

(1)新建txt文件,输入以下内容,并重命名为inc.php。

<?php
echo "this is inc.php";
?>

(2)浏览器通过URL访问http://127.0.0.1/FileInclusion/inc.php网页,显示如下,可以看到包含语句成功执行。
在这里插入图片描述

2.2.3 include()函数测试实例

(1)首次测试:新建txt文件,输入以下内容,并重命名为include.php。

<?php
echo "<h1>This is include.php</h1>";
include "./inc.php";
?>

(2)访问:浏览器通过URL访问http://127.0.0.1/FileInclusion/include.php网页,显示如下,可以看到包含语句成功执行。
在这里插入图片描述
(3)再次测试:修改include.php文件为以下内容,当使用了两次include语句(这是include函数的两种使用方式)。

<?php
include ("./inc.php");
echo "<h1>This is include.php</h1>";
include "./inc.php";
?>

(4)访问:浏览器访问http://127.0.0.1/FileInclusion/include.php该网页,显示如下,可以看到两个include语句均成功执行,且文件被包含了两次;同时也可以看出脚本文件是从上到下依次执行的。
在这里插入图片描述

2.2.4 include_once()函数测试实例

(1)测试:新建txt文件,输入以下内容,并重命名为include_once.php。

<?php
include_once ("./inc.php");
echo "<h1>This is include_once.php</h1>";
include_once "./inc.php";
?>

(2)访问:浏览器使用URL访问http://127.0.0.1/FileInclusion/include_once.php网页,显示如下,可以看到包含语句成功执行,但是只执行了一遍
在这里插入图片描述

2.2.5 require()函数测试实例

(1)首次测试:新建txt文件,输入以下内容,并重命名为require.php。

<?php
echo "<h1>This is require.php</h1>";
require "./inc.php";
?>

(2)访问:浏览器通过URL访问http://127.0.0.1/FileInclusion/require.php网页,显示如下,可以看到包含语句成功执行。
在这里插入图片描述
(3)再次测试:修改require.php文件为以下内容,这是require函数的两种使用方式。

<?php
require ("./inc.php");
echo "<h1>This is require.php</h1>";
require "./inc.php";
?>

(4)访问:浏览器访问http://127.0.0.1/FileInclusion/require.php该网页,显示如下,可以看到两个文件包含语句均成功执行,且执行效果一致;同时也可以看出脚本文件是从上到下依次执行的。截至到此,还未展示require函数与include函数的区别。
在这里插入图片描述

2.2.6 require_once()函数测试实例

(1)测试:新建txt文件,输入以下内容,并重命名为require_once.php。

<?php
require_once ("./inc.php");
echo "<h1>This is require_once.php</h1>";
require_once "./inc.php";
?>

(2)访问:浏览器使用URL访问http://127.0.0.1/FileInclusion/require_once.php网页,显示如下,可以看到文件包含语句成功执行,但是只执行了一遍
在这里插入图片描述

2.2.7 include函数与require函数的差异

(1)修改include.php文件为以下内容。

<?php
include ("./inc.php");
echo "<h1>This is include.php</h1>";
include "./inc1.php";
include "./inc.php";
?>

(2)访问:浏览器访问http://127.0.0.1/FileInclusion/include.php该网页,显示如下,可以看到第一和第三个包含语句成功执行,但是第二个报出警告,警告没有终止脚本执行。
在这里插入图片描述

(3)修改require.php文件为以下内容。

<?php
require ("./inc.php");
echo "<h1>This is require.php</h1>";
require "./inc1.php";
require "./inc.php";
?>

(4)访问:浏览器访问http://127.0.0.1/FileInclusion/require.php该网页,显示如下,可以看到第一个包含语句成功执行,第二个执行出错,报错致命错误,程序终止,导致后续脚本没有被执行。
在这里插入图片描述

3 PHP相关配置

文件包含是PHP的基本功能之一,由本地文件包含和远程文件包含之分(官网上不是这么理解的)。
(1)本地文件包含LFI(local file inclusion)当被包含的文件在服务器本地时,就形成本地文件包含。
(2)远程文件包含RFI(remote file inclusion)当被包含的文件在第三方服务器时,叫做远程文件包含,即可以跨服务器跨域(可以简单地认为其利用的协议为有http协议、ftp协议、php伪协议)。

3.1 配置文件

PHP的配置文件php.ini中,有allow_url_fopenallow_url_include两个参数对包含文件功能进行控制。
在这里插入图片描述

3.2 allow_url_fopen

(1)默认值为 On。
(2)本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。很多人都说该值为On时,才允许包含本地文件,而实际上无论该选项为On还是Off,均可以包含本地文件。

3.3 allow_url_include

(1)默认值为 Off,开启这个设置项需要先开启 allow_url_fopen 。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。
(2)为远程文件包含的开关。
(3)该选项自 PHP 7.4.0 起废弃。
(4)此选项允许以下函数使用具有 URL 感知的 fopen 包装器:include、include_once、require、require_once。

4 总结

(1)掌握4种文件包含函数的使用方法;
(2)了解PHP配置文件对文件包含功能的限制。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值