点我
文件包含漏洞
文件包含漏洞
一、定义
因为相同代码重复出现在不同文件中会产生代码冗余,所以出现了文件包含函数,让代码更为高效。需要用到这部分代码就会去调用,且被包含的文件会被当做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 />";
?>
运行结果:
五、防护措施
输入验证和过滤
- 对用户输入的数据进行严格的验证和过滤。例如,对于用于文件包含的参数,只允许特定的、预期的文件名或路径模式。可以使用白名单的方式,只允许包含特定目录下的文件,并且对文件名中的特殊字符(如
../
)进行过滤或转义。
- 对用户输入的数据进行严格的验证和过滤。例如,对于用于文件包含的参数,只允许特定的、预期的文件名或路径模式。可以使用白名单的方式,只允许包含特定目录下的文件,并且对文件名中的特殊字符(如
使用安全函数和配置
- 在 PHP 中,可以通过配置
php.ini
文件来禁用危险的函数。例如,将allow_url_include
设置为Off
,这样就可以禁止包含远程文件(对于 RFI 的防范)。同时,使用安全的文件操作函数,避免使用存在安全隐患的函数。
- 在 PHP 中,可以通过配置
最小权限原则
- 对 Web 应用程序的文件和目录设置合适的权限。确保应用程序只能访问它所需要的文件和目录,并且以最小的权限运行。例如,如果一个 Web 应用程序不需要写入某个目录,就不要给它写入权限,这样可以减少攻击者通过文件包含漏洞对文件进行恶意修改的风险。
代码审计和安全测试
- 定期对应用程序的代码进行审计,检查是否存在文件包含漏洞。同时,进行安全测试,如渗透测试,模拟攻击者的行为,发现潜在的文件包含漏洞并及时修复。
- 无需情况下设置allow_url_include和allow_url_fopen为关闭。
分类:
WEB安全
版权申明
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论