什么是文件包含漏洞——来自ChatGPT4
文件包含漏洞是指应用程序在加载文件时,允许用户控制被加载文件的名称,从而导致恶意代码的执行或敏感信息的泄露。文件包含漏洞主要分为两种:
- 本地文件包含漏洞(LFI) :攻击者可以包含服务器本地的任意文件,包括系统文件、配置文件、数据库文件等。
- 远程文件包含漏洞(RFI):攻击者可以包含远程服务器上的任意文件,包括其他网站的文件、恶意网站的文件等。
文件包含漏洞的危害性很大,攻击者可以利用该漏洞来执行以下操作:
- 执行任意代码:攻击者可以通过包含恶意的 PHP 脚本或其他可执行文件来执行任意代码,从而控制服务器。
- 窃取敏感信息:攻击者可以通过包含包含敏感信息的文件来窃取用户的密码、信用卡信息等敏感信息。
- 植入后门:攻击者可以通过包含包含后门的文件来植入后门,从而方便日后进行攻击。
以下是一些防范文件包含漏洞的措施:
- 在开发应用程序时,应使用白名单的方式来控制用户输入的文件名称,仅允许包含白名单中指定的文件。
- 在开发应用程序时,应对用户输入的文件名称进行严格的过滤,确保文件名称不包含任何特殊字符,例如
../
等。 - 关闭不必要的功能,例如远程文件包含功能。
为了防范文件包含漏洞,开发人员应在开发应用程序时严格控制用户输入,对用户输入的文件名称进行严格的过滤,确保只有合法的文件才能被包含。
我的理解
程序员在开发过程中为了方便,在1.php页面中直接使用2.php的内容,形成文件包含,包含后可以直接使用被包含的代码,避免重复造轮子,就造成了漏洞
前提条件介绍
PHP语言所提供的文件包含功能太强大、太灵活,所以大部分的文件包含的漏洞都出现在PHP的程序中。
- 当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
- 当被包含的文件在远程服务器时,就形成的远程文件包含漏洞。
远程包含需要开启php配置的allow_url_include=on
php配置
php.ini
里有两个参数
allow_url fopen:允许url里的封装协议访问文件(默认ON)
allow url include:允许包含url里的封装协议包含文件(默认OFF)
本地文件包含漏洞
<?php #如果这里$GET['filename']攻击者可控,且未经过过滤那么就会导致漏洞。
$filename =$_GET['filename'];
include($filename);
?>
函数 | 说明 |
---|---|
include | 包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。 |
include_once | 与include 不同处在于 include_once 会检查这个文件是否已经被导入,如已导入便不会再导入,直面 once 理解就是只导入一次。 |
require | 包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。 |
require_once | 和 require 类似,不同处在于 require_once 只导入一次。 |
被以上函数包含的文件一律按.php后缀解析!
这样就可以直接使用图片马了
实战中,黑盒测试看到?file=参数,直接先尝试/etc/passwd
file://协议
条件
- allow_url_fopen:off/on
- allow_url_include:off/on
作用
用于访问本地文件系统
说明
用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。
用法
-
file://[文件的绝对路径和文件名]:
?file=file://D:/xxxx/1.txt
127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
-
file=[文件的相对路径和文件名]:
?file=./1.txt
127.0.0.1/include.php?file=./phpinfo.txt
-
file=[http://网络路径和文件名]:
?file=http://127.0.0.1/1.txt
127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt