File Inclusion(文件包含漏洞)

本文介绍了PHP中的文件包含功能,包括include、require、include_once和require_once的使用及区别。重点讨论了本地文件包含(LFI)和远程文件包含(RFI)漏洞,列举了可能的敏感信息路径,并提出了防护措施,如过滤危险字符、限制文件包含路径等。此外,还提到了PHP伪协议如php://filter和data://在文件包含中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概念

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

2. 原理:

文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

3. 函数

3.1 include

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

3.2 require

在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最后后按新的php文件执行程序代码。【先加载后执行】

3.3 include_once

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

3.4 require_once

require_once语句是require语句的延伸,他的功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。【同时使用require_once语句在同一页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行】

4. 本地文件包含(Local File Include; LFI)

仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

一些常见的敏感信息路径:
Windows系统:

  • c:\boot.ini // 查看系统版本
  • c:\windows\system32\inetsrv\MetaBase.xml //
  • IIS配置文件 c:\windows\repair\sam // 存储Windows系统初次安装的密码
  • c:\ProgramFiles\mysql\my.ini // MySQL配置
  • c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
  • c:\windows\php.ini // php 配置信息

Linux/Unix系统:

  • /etc/passwd // 账户信息
  • /etc/shadow // 账户密码文件
  • /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
  • /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
  • /usr/local/app/php5/lib/php.ini // PHP相关配置
  • /etc/httpd/conf/httpd.conf // Apache配置文件
  • /etc/my.conf // mysql 配置文件

5. 远程文件包含(Remote File Include; RFI)

能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。

前提:
allow_url_include = ON
allow_url_fopen = ON

6. PHP伪协议

用于执行特定操作。例如,当路径指向一个PHP文件时,访问该路径,会导致执行PHP,如果想读取该PHP文件的内容(代码),就需要使用php://filter伪协议。

6.1 php://filter

有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,此时就需要使用php://filter。
例如:php://filter/convert.base64-encode/resource=文件路径

6.2 data://

利用data:// 伪协议可以直接达到执行php代码的效果。

6.3 zip://

如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议直接执行,而无需提前解压。

6.4 php://input

利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码。

7. 防护

  • 使用str_replace等方法过滤掉危险字符

  • 配置open_basedir,防止目录遍历

  • php版本升级,防止%00截断

  • 对上传的文件进行重命名,防止被读取

  • 对于动态包含的文件可以设置一个白名单,不读取非白名单的文件

  • 做好管理员权限划分,做好文件的权限管理

References:

poggioxay
Matthew…
Monsterlz123
pikachu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值