点我

文件包含漏洞

一、定义

因为相同代码重复出现在不同文件中会产生代码冗余,所以出现了文件包含函数,让代码更为高效。需要用到这部分代码就会去调用,且被包含的文件会被当做PHP代码执行,而且忽略后缀本身。

注意:文件包含并不是漏洞,但是被包含的文件能够被攻击者控制就是漏洞。

二、分类

文件包含分为

  • 本地包含(LFI)
  • 远程包含(RFI) 【远程包含默认不开启 allow_url_include = Off】

注意:他们可以转换,本地文件包含并不代表无法包含远程文件(SMB服务)。

三、函数解析

include()

  • 引用外部文件
  • 只有代码执行到include代码段时,调用的外部文件才会被引用并读取
  • 当引用的文件发生错误时,系统只会给出警告错误,而整个php文件会继续执行

include_once()

include()函数的区别是:

  • 会在导入文件前先检测文件是否在该页面的其他部分被引用过,如果有,程序只能引用一次
  • 如果导入的文件中存在自定义函数,那么在同一程序中重复导入该文件,在第二次导入时会发生错误
  • 因为PHP不允许相同名称的函数重复声明

require()

  • 引用外部文件
  • 在PHP文件被执行之前,会先去把被包含文件的内容提取出来然后整合成新的php一起执行
  • 当引用文件发生错误时,系统会报错,并停止执行下面代码

require_once()

与require()函数唯一区别是
  • 会在导入文件前先检测文件是否在该页面的其他部分被引用过,如果有,程序只能引用一次

四、示例

# 1.txt
<?php echo "efg";?>

include()

引用外部文件

# 1.php
<?php 
    echo "abc <br />";
    include("1.txt");
    echo "<br /> abc <br />";
    include("1.txt");
    echo "<br /> abc <br />";
 ?>

执行结果:
在这里插入图片描述

引用不存在的[错误的]外部文件

# 1.php
<?php 
    echo "abc <br />";
    include("1.jpg"); //引用不存在的1.jpg
    echo "<br /> abc <br />";
    include("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:
在这里插入图片描述

include_once()

引用外部文件

# 1.php
<?php 
    echo "abc <br />";
    include_once("1.txt");
    echo "<br /> abc <br />";
    include_once("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:

在这里插入图片描述

引用不存在的[错误的]外部文件

# 1.php
<?php 
    echo "abc <br />";
    include_once("1.jpg"); //不存在的1.jpg
    echo "<br /> abc <br />";
    include_once("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:
在这里插入图片描述

require()

引用存在的外部文件

#1.php
<?php 
    echo "abc <br />";
    require("1.txt");
    echo "<br /> abc <br />";
    require("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:
在这里插入图片描述
引用不存在的[错误的]外部文件

# 1.php
<?php 
    echo "abc <br />";
    require("1.jpg");  //不存在的1.jpg
    echo "<br /> abc <br />";
    require("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:
在这里插入图片描述

require_once()

引用存在的外部文件

#1.php
<?php 
    echo "abc <br />";
    require_once("1.txt");
    echo "<br /> abc <br />";
    require_once("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:
在这里插入图片描述

引用不存在的[错误的]外部文件

# 1.php 
<?php 
    echo "abc <br />";
    require_once("1.jpg");//不存在的1.jpg
    echo "<br /> abc <br />";
    require_once("1.txt");
    echo "<br /> abc <br />";
 ?>

运行结果:

img

五、防护措施

  • 输入验证和过滤

    • 对用户输入的数据进行严格的验证和过滤。例如,对于用于文件包含的参数,只允许特定的、预期的文件名或路径模式。可以使用白名单的方式,只允许包含特定目录下的文件,并且对文件名中的特殊字符(如 ../)进行过滤或转义。
  • 使用安全函数和配置

    • 在 PHP 中,可以通过配置 php.ini 文件来禁用危险的函数。例如,将 allow_url_include 设置为 Off,这样就可以禁止包含远程文件(对于 RFI 的防范)。同时,使用安全的文件操作函数,避免使用存在安全隐患的函数。
  • 最小权限原则

    • 对 Web 应用程序的文件和目录设置合适的权限。确保应用程序只能访问它所需要的文件和目录,并且以最小的权限运行。例如,如果一个 Web 应用程序不需要写入某个目录,就不要给它写入权限,这样可以减少攻击者通过文件包含漏洞对文件进行恶意修改的风险。
  • 代码审计和安全测试

    • 定期对应用程序的代码进行审计,检查是否存在文件包含漏洞。同时,进行安全测试,如渗透测试,模拟攻击者的行为,发现潜在的文件包含漏洞并及时修复。
  • 无需情况下设置allow_url_include和allow_url_fopen为关闭。
分类: WEB安全

评论

-- 评论已关闭 --

目录