资讯动态

从[极客大挑战 2019]Secret File 看伪协议读取文件:用 TaoToken 统一 Key 复现 php://filter 与 base64 链路

发布时间:2026/10/13 6:12:59 来源:尧图企业网站定制
1. 从 Secret File 入口看伪协议读取文件到底在做什么如果你刚接触 CTF 里的文件包含漏洞看到php://filter这一串东西大概率会懵这既不像普通 URL也不像文件路径为什么它能读到源码我拿极客大挑战 2019 的 Secret File 这道题当例子把整条链路拆开讲清楚。核心检索词就是伪协议读取文件它指的是 PHP 在文件操作函数里支持的一类特殊封装协议php://filter是其中最常用于 CTF 的一种作用是给数据流套一层过滤器比如把源码做 base64 编码后再输出。这道题适合谁适合已经会看网页源码、会用 Burp 抓包但对文件包含漏洞和伪协议还不熟的人。你不需要很深的 PHP 功底只要能跟着构造请求、看懂返回结果就行。整道题的走向大概是首页源码里藏了一个链接点进去有个按钮点击后跳转抓包发现中间还有一个secr3t.php访问它能看到一段被过滤了关键字符的源码最后用php://filter把flag.php的源码以 base64 形式读出来再解码。我试过把每一步都单独验证发现最容易卡住的地方不是 payload 本身而是不知道请求该发到哪个文件、参数名是什么。所以下面我会把入口探测、参数确认、payload 构造、base64 解码这几步都写全并且说明怎么用 TaoToken 统一 Key 来管理调试过程中要调用的模型接口避免在多个 Key 之间来回切换。先明确一个概念文件包含漏洞的本质是后端把用户可控的输入拼进了include、require、file_get_contents这类函数。当输入没有被严格限制你就能让它去读本不该读的文件。php://filter的经典用法是php://filter/convert.base64-encode/resource目标文件这样目标文件不会被执行而是被编码成 base64 字符串返回你解码后就能看到原始 PHP 源码。理解这一点后面所有操作都是围绕它展开的。2. TaoToken 前置准备统一 Key 与 API 通道怎么配在复现这类题目时我经常需要让模型帮我解释一段源码、生成 payload 变体或者核对 base64 解码结果。如果每个工具都单独配 Key管理起来很乱。TaoToken 的思路是给你一个统一的 Key 和 API 通道兼容常见的接口格式这样你在不同调试脚本、不同客户端里都用同一套凭证。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。你需要先拿到 Key。登录后进入控制台在 API Keys 页面创建一个新的 Key复制保存好。这个 Key 就是后面所有请求里Authorization头要带的东西。注意不要把它提交到公开仓库CTF 环境里也一样养成习惯。配置的时候有三个要素必须对齐Base URL、Key、Model ID。Base URL 用https://taotoken.net/apiKey 用你刚创建的那串Model ID 按你实际要调用的模型填。很多 401 报错就是因为这三者有一个没对上比如 Base URL 多写了斜杠、Key 复制时带了空格、Model ID 写成了展示名而不是真实 ID。如果你用的是命令行工具或者脚本可以先把环境变量设好避免每次手写。下面是一个通用的环境变量配置示例你可以放在 shell 的 profile 里也可以临时 exportexport TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_MODEL你的ModelID设置完之后可以用一个最简单的请求验证通道是否通。这一步很关键因为后面排障时你要先排除是通道问题还是题目环境问题。验证请求我会放在第 4 节这里先把配置讲透。另外如果你要做长期的编码或 Agent 类任务可以考虑 Coding Plan它更适合持续调用只是临时验证模型输出用模型对话页面就够了。接入细节可以看接入文档里面有各语言的示例。3. 可复制配置php://filter 转换链与请求构造这一节是整篇的核心我会给出可以直接复制的配置片段和请求构造方式。先回到题目本身。打开环境后右键查看源码能看到一个idmaster的链接指向./Archive_room.php。访问它页面上有个按钮点击后会自动跳到end.php。这时候开 Burp 抓包点 SECRET 按钮在历史里能找到secr3t.php这个请求。直接访问secr3t.php返回的是一段源码里面过滤了../、tp、input、data这些关键字。过滤规则意味着你不能用../做目录穿越也不能用php://input或php://data这类伪协议。但php://filter没有被过滤所以它就是突破口。参数名从源码里能看出来是file于是 payload 就是?filephp://filter/convert.base64-encode/resourceflag.php完整请求 URL 形如http://目标地址/secr3t.php?filephp://filter/convert.base64-encode/resourceflag.php这里convert.base64-encode是过滤器名resourceflag.php指定要读取的目标文件。后端执行时会把flag.php的内容读出来经过 base64 编码后输出而不是当作 PHP 执行。所以你看到的是一串 base64 字符串而不是页面渲染结果。如果你要在脚本里复现这个请求可以用 curlcurl -s http://目标地址/secr3t.php?filephp://filter/convert.base64-encode/resourceflag.php拿到返回的 base64 后解码echo 返回的base64字符串 | base64 -d解码后就能看到flag{...}。这一步的配置要点是过滤器链可以叠加比如convert.base64-encode前面还能加string.strip_tags之类但本题只需要 base64 编码就够。resource 后面的文件名要和你实际想读的文件一致本题是flag.php。如果你想把 TaoToken 的调用也纳入这套调试流程可以写一个 JSON 配置文件把 Base URL、Key、Model ID 放进去方便脚本读取。下面是一个示例结构{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的ModelID, timeout: 30 }这个文件放在你的项目目录里脚本读取后拼请求头。注意base_url不要带结尾斜杠api_key不要有多余空格。Model ID 一定要用真实 ID不确定就去控制台或文档里核对。把这三件套对齐后面无论你是让模型解释源码还是生成 payload 变体都不会因为配置问题卡住。4. 验证请求与成功结果从 base64 到 flag 的完整链路配置好之后先验证 TaoToken 通道是否可用。用一个最小的请求测试确认返回正常。以 curl 为例curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: $TAOTOKEN_MODEL, messages: [{role: user, content: 回复 ok}] }如果返回里有正常的choices字段和内容说明通道没问题。如果报 401先检查 Key 是否正确、有没有多余空格如果报 model 相关错误检查 Model ID 是否写对。这一步通过后再回到题目环境验证 payload。访问构造好的 URL你会得到一串类似ZmxhZ3s2NTc3YmYxZS1iYjM0LTQ5Y2YtOTY2Zi1lOGIyOTA2N2I3OWF9的 base64。把它解码echo ZmxhZ3s2NTc3YmYxZS1iYjM0LTQ5Y2YtOTY2Zi1lOGIyOTA2N2I3OWF9 | base64 -d输出就是flag{6577bf1e-bb34-49cf-966f-e8b29067b79a}。到这里整条链路就通了入口探测找到secr3t.php确认参数名file构造php://filterpayload拿到 base64解码得到 flag。成功结果的特征是返回内容是一段可解码的 base64解码后能看到flag{开头的内容。如果返回的是空白或者报错说明 payload 有问题或者目标文件路径不对。这时候可以先用resourceindex.php测试过滤器是否生效确认过滤器本身没问题再换成flag.php。验证过程中我建议把每一步的返回都保存下来方便对比。比如把 base64 存到文件再解码避免复制粘贴出错。另外如果你用 TaoToken 让模型帮你核对解码结果记得把 base64 字符串完整传进去不要截断否则模型可能给出错误判断。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth复现过程中会遇到几类典型报错我逐个说清楚怎么排查。第一类是 401。这个几乎都是 Key 的问题。检查Authorization头是不是Bearer加 Key中间有一个空格检查 Key 有没有过期或被删除检查是不是把 Base URL 和 Key 搞混了。如果你用的是环境变量确认变量真的被加载了可以用echo $TAOTOKEN_API_KEY看一下。第二类是 local proxy failed。这个通常出现在你本地配了代理但代理没启动或者代理地址写错。排查方法是先确认本地网络能直连把代理相关配置临时去掉再试。注意这里说的是本地调试工具的代理设置不是让你去用什么特殊网络手段只是检查配置项是否多余。第三类是 reading choices 相关报错比如返回结构里没有choices字段。这多半是请求体格式不对或者 Model ID 不存在。检查 JSON 是否合法messages是不是数组model字段是不是真实 ID。有时候返回的是错误对象里面会有error字段先看那个。第四类是 OAuth 相关报错。如果你用的是某些需要 OAuth 授权的客户端报错说明授权流程没走完或者 token 过期。这时候重新走一遍授权或者改用 API Key 方式。对于 Codex 这类工具如果出现auth.json相关提示说明它的凭证文件有问题你需要检查auth.json里的 Base URL、Key、Model ID 三件套是否完整且正确。这三者缺一不可任何一个写错都会导致认证失败。另外题目环境本身也可能出问题比如目标地址失效、返回 404。这时候先确认 URL 拼写再确认环境是否还在运行。CTF 环境有时效性过期了就得重新开。排障的顺序建议是先验证 TaoToken 通道用最小请求再验证题目环境访问首页最后验证 payload换 resource 测试。这样能快速定位问题出在哪一层而不是盲目改 payload。6. 把统一 Key 用在后续 CTF 调试里这道题跑通之后你会发现php://filter的套路可以迁移到很多类似场景。只要目标存在文件包含且没过滤伪协议你就能用 base64 编码读源码。变体包括叠加多个过滤器、读不同文件、用convert.iconv做编码转换等。核心思路不变让后端把文件内容当数据流处理而不是当代码执行。TaoToken 在这里的价值是让你有一套统一的 Key 和 API 通道。你可以在调试脚本里直接调用模型来解释源码、生成 payload 变体、核对解码结果不用为每个工具单独配一套凭证。需要创建 Key 就去 API Keys 页面需要看接入示例就看接入文档想直接和模型对话验证思路就用模型对话长期做编码或 Agent 任务可以考虑 Coding Plan。把这些入口收藏好下次遇到新题能省不少配置时间。最后留一个实用技巧把常用的 payload 模板和 base64 解码命令存成一个脚本遇到新题改一下目标地址和文件名就能用。比如#!/bin/bash TARGET$1 FILE${2:-flag.php} RESP$(curl -s ${TARGET}/secr3t.php?filephp://filter/convert.base64-encode/resource${FILE}) echo $RESP | base64 -d这样你只需要传目标地址和文件名就能自动完成请求和解码。注意脚本里的参数名file要和你实际题目的参数名一致不一致就改掉。养成这个习惯复现速度会快很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑