一、文件包含漏洞概述
1.1 什么是文件包含
开发人员将需要重复调用的函数写入一个文件,对该文件进行包含时产生的操作。这样编写代码能减少冗余,降低代码后期维护难度。
保证网站整体风格统一:导航栏、底部footer栏等,把这些不会变的东西包含在一个文件中,可以保证整体效果的统一和代码量的减少。
1.2 漏洞产生原因
文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制,包含其他恶意的文件,导致了执行非预期代码
1.3 简单例子
上述例子并没有对filename进行过滤,这就导致了可能会上传一些敏感文件,产生文件包含漏洞
1.4 PHP中的文件包含函数
二、文件包含漏洞类型及利用
2.1 本地文件包含
本地文件包含(Local File Inclusion,LFI)漏洞是一种常见的安全漏洞,它允许攻击者通过应用程序的输入来包含服务器上的本地文件。这种漏洞通常发生在应用程序未能正确地清理或验证用户输入时,导致攻击者能够访问服务器上的敏感文件,如配置文件、源代码文件等。
2.2 本地文件漏洞包含利用方式:
- 直接文件路径引用:通过在URL或表单输入中直接指定文件路径,尝试访问如
/etc/passwd
等敏感文件。 - 利用“.”或“..”:通过使用“..”来遍历目录,访问上级目录中的文件。
- 利用空字节:在某些情况下,通过在文件名中插入空字节(%00或
\x00
),可以绕过对文件名的某些检查。 - 利用URL编码:通过URL编码特殊字符,如将
../
编码为%2e%2e/
,来绕过简单的输入过滤。 - 利用PHP伪协议:在PHP中,可以通过伪协议(如
php://filter
)来读取文件内容。 - 利用服务器配置:如果服务器配置不当,可能允许执行某些特殊的文件操作,如通过
expect://
伪协议来执行程序。 - 利用文件包含漏洞读取远程文件:如果本地文件包含漏洞被限制为只允许包含本地文件,尝试利用远程文件包含(Remote File Inclusion,RFI)的技巧来间接包含远程文件。
2.3 远程文件包含漏洞
远程文件包含(Remote File Include, RFI)漏洞允许攻击者包含一个远程服务器上的文件,这通常是由于Web应用程序对用户输入过滤不严导致的。
2.4 远程文件包含漏洞利用方式:
- 利用不当配置:当服务器的
php.ini
配置中allow_url_include
选项开启时,攻击者可以利用这一点包含远程服务器上的文件。这要求远程文件的后缀不是PHP,以避免解析冲突 7。 - 无限制远程文件包含:如果应用程序没有对包含的文件类型或来源进行限制,攻击者可以轻易地包含远程文件,并执行其中的代码 7。
- 有限制远程文件包含:在存在一些限制的情况下,例如只允许包含具有特定后缀的文件,攻击者可能需要使用一些技巧来绕过这些限制,例如使用URL编码或特殊字符 7。
- 利用PHP伪协议:PHP提供了多种伪协议,如
php://input
和data://
,这些可以用于读取或执行代码。例如,php://input
可以读取POST请求的数据,而data://
可以将文本、base64编码的字符串作为数据流 911。 - 利用日志文件:如果攻击者能够通过日志文件记录恶意请求,并且应用程序包含这些日志文件,那么攻击者可以执行日志中记录的PHP代码 9。
- 利用临时文件:在某些情况下,如果应用程序处理文件上传,攻击者可以利用临时文件的生成和删除之间的时间差来包含这些文件 9。
- 利用竞争条件:在某些情况下,如果应用程序在包含文件之前写入临时文件,攻击者可以利用时间差来覆盖该临时文件,从而包含恶意代码 9。
- 利用编码和URL技巧:攻击者可以使用URL编码或特殊字符来绕过输入过滤,例如使用
%00
截断或使用点号(.
)进行路径遍历 911。 - 利用文件包含与改写文件:在某些情况下,如果攻击者能够控制包含的文件内容,并且应用程序允许写入文件,攻击者可以修改现有文件或创建新文件来包含恶意代码 11。
- 利用Session文件:如果应用程序使用Session存储用户信息,并且Session文件可被包含,攻击者可以利用这一点来执行恶意代码