初探文件包含漏洞

1.什么是文件包含漏洞

文件包含漏洞是一种常见的web应用程序安全漏洞,它主要出现在使用服务器端脚本语言(如PHP、ASP等)编写的网页中。这个漏洞的核心在于,开发者在编写代码时,会使用诸如include()、require()这样的函数来导入或包含其他外部文件的代码以便重用。这些函数的目的本来是为了模块化和减少代码重复,但如果没有对用户可控的变量进行严格的过滤和检查,就可能被恶意利用。

2.漏洞分类

本地文件包含漏洞(LFI, Local File Inclusion): 如果攻击者可以控制被包含文件的路径参数,并且系统没有充分校验,攻击者就可以让服务器加载一个恶意选择的本地文件,比如敏感配置文件或日志文件,从而导致信息泄露。更严重的情况下,如果存在特殊的文件解析漏洞,攻击者甚至可能执行任意代码。

远程文件包含漏洞(RFI, Remote File Inclusion): 当服务器允许通过URL动态包含远程文件,并且相关的PHP配置选项(如allow_url_include和allow_url_fopen)开启时,攻击者可能通过构造特定的请求,使得服务器去下载并执行攻击者指定的远程服务器上的恶意代码,从而完全控制目标服务器。

3.php中常见的文件包含函数

include()
该函数用于将指定文件的内容合并到当前脚本中。如果包含的文件找不到或发生错误,脚本会继续执行,并且会产生一个警告级别的错误信息。

require()
require与include功能类似,也是将外部文件的内容插入到当前脚本执行流中。但当所包含文件不存在或出错时,require会导致一个致命错误(E_COMPILE_ERROR),脚本会立即停止执行。

include_once()
此函数和include非常相似,不同之处在于它会在包含文件之前检查该文件是否已经被包含过。如果文件已经包含了,则不会再次包含,从而避免了重复定义函数、类或者变量等问题。

require_once()
这个函数也类似于require,但在包含文件时具有“一次”的特性,即如果目标文件在这次脚本执行过程中已包含过,则不会再次包含它。同样,由于是require系列的函数,因此在遇到包含失败的情况时,脚本也会停止执行并抛出致命错误。

4.文件包含漏洞的绕过方法

4.1本地文件包含(LFI)绕过方法:

1.目录遍历:
利用.(当前目录)、…(上级目录)以及路径遍历字符序列(如 /…/…/)尝试访问超出预期目录之外的文件。

2.编码绕过:
URL编码、双URL编码、十六进制编码、八进制编码等不同类型的编码方式试图绕过过滤器。
使用 %00 等特殊字符截断字符串,利用C语言风格的字符串终止符提前结束文件名。

3.利用解析漏洞:
PHP魔术引号(Magic Quotes)关闭时,通过在路径中注入单引号、双引号等特殊字符,尝试引起代码注入。
PHP版本相关的解析漏洞,例如PHP的NULL字节截断漏洞。

4.利用系统特性:
Linux下利用绝对路径、符号链接或者伪协议(如 file:///etc/passwd)。
Windows环境下使用反斜杠 \ 或 UNC 路径等方式尝试访问系统上的其他位置。

4.2远程文件包含(RFI)绕过方法:

1.利用不严谨的验证机制:
如果目标程序对URL包含没有严格检查,直接提供一个可以控制的远程URL以加载恶意文件。

2.协议欺骗:
利用伪协议,如数据流伪协议(如 data://)嵌入并执行代码,或利用其他可能存在的未过滤的协议(如 file://, php://input 等)。

3.HTTP头部注入:
在某些情况下,如果应用基于HTTP头进行文件包含,攻击者可能会篡改请求头中的内容来触发包含。

4.后缀名检测绕过:
尝试修改上传或包含文件的后缀名,使之看起来像是合法文件,同时利用服务器的文件解析漏洞执行脚本代码。

4.二次注入:
如果应用程序将用户输入存储到数据库或其他持久化层,然后在后续处理中包含这些存储的数据作为文件名,攻击者可以通过注入恶意payload并在后期触发包含执行。

5.时间延迟攻击:
利用一些环境下的文件包含函数对不存在文件的响应速度差异,通过盲注方式猜测系统文件结构。

6. 利用文件解析漏洞:
不同脚本语言在处理包含文件时可能存在解析逻辑上的缺陷。例如PHP中,如果一个文件以 <?php 开头且以 ?> 结束,那么文件会被当作PHP代码执行。攻击者可能会尝试构造特殊格式的文件名,使得服务器在包含文件时误将其内容当作代码执行。

7. 利用环境变量或配置不当:
如果应用程序错误地将用户输入用于设置环境变量,而这些变量又被用来构建包含文件的路径,攻击者就可以通过注入恶意值来控制文件包含。

8. PHP伪协议利用:
PHP提供了一些伪协议,如 data://, php://filter/ 等,攻击者可以利用它们实现数据流或者过滤器功能来执行恶意代码。例如,通过 php://filter/read=convert.base64-encode/resource=index.php 来读取并base64编码指定本地文件的内容。

9. 利用CGI和FastCGI参数传递机制:
在某些情况下,攻击者可能会通过修改HTTP请求中的特定参数(如PATH_INFO、SCRIPT_FILENAME等),影响Web服务器如何解析和执行PHP脚本,从而触发文件包含漏洞。

5.对于文件包含漏洞的防御措施

1.严格的输入验证:
对所有传入到文件包含函数(如PHP中的include(), require(), include_once(), require_once()等)的参数进行严格的校验。
只允许包含指定目录下的文件,并确保这些目录不包含敏感数据或可执行脚本。
使用白名单机制,仅允许包含预先定义好的、安全的文件名或路径。

2.过滤特殊字符和路径遍历序列:
阻止恶意用户通过使用相对路径(…)、绝对路径或者URL编码、十六进制编码等方式尝试访问非预期的文件或目录。
过滤掉可能导致目录遍历的字符序列,比如\、/、.等。

3.禁用危险配置:
在PHP环境中,关闭allow_url_include配置选项以防止远程文件包含(RFI)漏洞的发生。
根据实际需求调整其他相关配置,如限制allow_url_fopen,避免从不受信任的源加载文件。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值