您的当前位置:首页正文

【CTF】文件包含漏洞-php://filter 流包装器 【详】

2024-11-13 来源:个人技术集锦

php://filter 流包装器

php://filter 是 PHP 中的一种流包装器,允许开发者对文件、数据流或资源在读取或写入时进行特定的过滤处理通过 php://filter,你可以在文件被读取或输出之前,对其内容进行某些操作,例如编码、解码、压缩等。

它在一些特定场景下非常有用,比如对文件内容进行处理,而不是直接输出文件的原始内容。在CTF(Capture The Flag)竞赛中,攻击者可以利用 php://filter 包装器绕过某些安全限制,从而获取敏感文件的内容。

php://filter 的语法结构

php://filter/<操作>/resource=<目标文件>
  • <操作>:对数据进行的操作。常见的操作包括编码、解码、字符串转换等。
  • <目标文件>:指定的文件或数据流资源。
示例

假设有一个文件 test.txt,内容为 Hello, World!,我们可以通过 php://filter 以多种方式对其进行读取和操作。

常见的 php://filter 操作

  • convert.base64-encode:将读取的数据编码为 Base64 格式。
  • convert.base64-decode:将读取的数据从 Base64 格式解码。
  • string.rot13:将读取的数据通过 ROT13 进行加密或解密(是一种字母替换加密)。
  • convert.quoted-printable-encode:将数据编码为 quoted-printable 格式。
  • convert.quoted-printable-decode:将数据从 quoted-printable 格式解码。
  • convert.iconv.*:转换文件字符编码。
  • resource=<filename>:指定要操作的文件或数据流。

php://filter 的两种主要操作方向

  1. 读取时的过滤 (read):在读取文件时,应用指定的过滤器。

    php://filter/read=convert.base64-encode/resource=<filename>
    

    这会将读取到的文件内容进行 Base64 编码。

  2. 写入时的过滤 (write):在写入文件时,应用指定的过滤器。

    例如:

    php://filter/write=convert.base64-encode/resource=<filename>
    

    这会将写入的数据先进行Base64编码后再写入目标文件。

利用 php://filter 进行文件包含漏洞攻击

1. 绕过文件包含和读取源码

在某些文件包含漏洞(如 LFI:本地文件包含)中,攻击者无法直接读取或查看文件的源码,因为 PHP 文件通常会在服务器端执行而不直接输出原始内容。但攻击者可以使用 php://filter 来获取文件的原始源码内容并以可读形式输出。

示例攻击:

假设在CTF挑战中,有一个存在本地文件包含漏洞的代码片段:

<?php
include($_GET['page']);
?>

攻击者可以通过访问 php://filter 来读取文件的源码并进行Base64编码输出:

http://example.com/index.php?page=php://filter/read=convert.base64-encode/resource=flag.php

这里,攻击者通过 php://filter 包装器将 flag.php 文件的内容进行Base64编码并包含到页面中。这样可以避免直接执行PHP代码,而是将源码以Base64格式输出。攻击者拿到这个Base64编码的内容后,可以解码成原始的PHP代码。

例如,假设 flag.php 的内容是:

<?php
$flag = "CTF{secret_flag}";
?>

经过Base64编码后,输出如下:

PD9waHAgCiAkZmxhZyA9ICJDVEYgezNlY3JldF9mbGFnIjsKPz4=

攻击者将此字符串解码后,可以看到原始的PHP代码,并获取 flag 的值。

2. 读取其他敏感文件

php://filter 不仅可以用来读取PHP源码,还可以读取系统中的其他敏感文件。例如,读取 /etc/passwd 文件中的用户信息:

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

通过这种方式,攻击者可以轻松绕过文件包含漏洞中对PHP文件的限制,读取任意系统文件并获取敏感信息。

CTF中 php://filter 的常见利用场景

在CTF比赛中,php://filter 常用于绕过源代码隐藏机制或通过文件包含漏洞获取敏感文件。以下是一些常见场景:

  1. 读取源代码:当服务器执行PHP代码而不显示源代码时,攻击者可以通过 php://filter 包装器来查看PHP文件的原始代码。

  2. 绕过过滤限制:某些挑战可能会限制直接访问某些文件(如 flag.phpconfig.php),但攻击者可以使用 php://filter 进行编码绕过,并获取文件内容。

  3. 信息泄露:通过 php://filter,攻击者可以访问包含系统信息的文件(如 /etc/passwd),从而获取用户账户信息。

防御措施

为了防止 php://filter 被恶意利用,开发者可以采取以下防御措施:

  1. 禁用 php:// 流包装器

    php.ini 中禁用远程文件包含和流包装器(如 allow_url_include=Offallow_url_fopen=Off),防止使用 php:// 相关功能。
  2. 严格验证用户输入

    任何允许用户输入文件路径的应用都应对路径进行严格验证。应使用白名单机制来控制哪些文件可以被访问。
  3. 最小化文件访问权限

    确保Web服务器对敏感文件(如 /etc/passwd、配置文件)设置了最小化的权限,只有必要的进程和用户才能访问这些文件。
  4. 限制文件包含函数

    尽量避免使用 include()require() 等文件包含函数来直接加载用户提供的文件路径。
Top