【文件包含漏洞01】文件包含功能介绍与测试——以PHP语言为例

1 文件包含

  1. 应用背景:程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数时,直接调用此文件,无需多次编写,这种调用文件的过程称为文件包含。
  2. 普适性:机会所有脚本语言都会提供文件包含功能,本文主要以PHP语言为例进行介绍。

2 PHP文件包含语句简介与测试

2.1 包含语句简介

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

2.2 语句功能测试

2.2.1 测试环境

  1. 本文实验基于WAMP环境进行测试,环境部署过程参考文章《win2008R2SP1+WAMP环境部署》。
  2. 在该环境网站根目录下,新建文件夹test,在test文件夹下新建以下文件进行实验。
  3. 直接使用win2008系统上的浏览器来访问不同函数的执行效果。

2.2.2 被包含文件

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

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

2.2.3 include()函数功能测试

  1. 新建txt文件,输入以下内容,并重命名为include.php。
<?php
echo "<h1>This is include.php!</h1>";
include "./inc.php";
?>
  1. 浏览器通过URL访问127.0.0.1/test/include.php网页,显示如下,可以看到包含语句成功执行。
    在这里插入图片描述
  2. 修改include.php文件为以下内容,这是include函数的两种使用方式。
<?php
include ("./inc.php");
echo "<h1>This is include.php!</h1>";
include "./inc.php";
?>
  1. 浏览器访问127.0.0.1/test/include.php该网页,显示如下,可以看到两个语句均成功执行,且执行效果一致;同时也可以看出脚本文件是从上到下依次执行的。
    在这里插入图片描述

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";
?>
  1. 浏览器使用URL访问127.0.0.1/test/include_once.php网页,显示如下,可以看到包含语句成功执行,但是只执行了一遍。
    在这里插入图片描述

2.2.5 require()函数功能测试

  1. 新建txt文件,输入以下内容,并重命名为require.php。
<?php
echo "<h1>This is require.php!</h1>";
require "./inc.php";
?>
  1. 浏览器通过URL访问127.0.0.1/test/require.php网页,显示如下,可以看到包含语句成功执行。
    在这里插入图片描述

  2. 修改require.php文件为以下内容,这是require函数的两种使用方式。

<?php
require ("./inc.php");
echo "<h1>This is require.php!</h1>";
require "./inc.php";
?>
  1. 浏览器访问127.0.0.1/test/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";
?>
  1. 浏览器使用URL访问127.0.0.1/test/require_once.php网页,显示如下,可以看到包含语句成功执行,但是只执行了一遍。
    在这里插入图片描述

2.2.7 测试include函数与require函数的差异

  1. 修改include.php文件为以下内容,这是include函数的两种使用方式。
<?php
include ("./inc.php");
echo "<h1>This is include.php!</h1>";
include "./inc1.php";
include "./inc.php";
?>
  1. 浏览器访问127.0.0.1/test/include.php该网页,显示如下,可以看到第一和第三个包含语句成功执行,但是第二个报出警告,警告没有终止脚本执行。
    在这里插入图片描述
  2. 修改require.php文件为以下内容,这是require函数的两种使用方式。
<?php
require ("./inc.php");
echo "<h1>This is require.php!</h1>";
require "./inc1.php";
require "./inc.php";
?>
  1. 浏览器访问127.0.0.1/test/require.php该网页,显示如下,可以看到第一个包含语句成功执行,第二个执行出错,报错致命错误,程序终止,导致第三个包含语句没有执行。
    在这里插入图片描述

3 PHP相关配置

3.1 配置文件

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

3.2 allow_url_fopen

  1. 默认值为 On
  2. 本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。

3.3 allow_url_include

  1. 默认值为 Off,开启这个设置项需要先开启 allow_url_fopen 。
  2. 该选项自 PHP 7.4.0 起废弃。
  3. 此选项允许以下函数使用具有 URL 感知的 fopen 包装器:include、include_once、require、require_once。

4 总结

  1. 掌握4种文件包含函数的使用方法;
  2. 了解PHP配置文件对文件包含功能的限制。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值