BUUCTF Web第二页实战:文件包含、伪协议与上传绕过全解析
打开BUUCTF的Web题列表翻过第一页大多数人第一次意识到自己的新手期结束了。第一页的题目很善良SQL注入会告诉你注入点在哪命令执行会留好回显弱口令甚至把用户名直接写在注释里。可到了第二页题风就变了页面干干净净只给一个压缩包下载或者一个上传框再或者一串不知道从哪入口的URL参数。你要自己找漏洞点自己拼链路自己处理各种意想不到的过滤规则。这篇文章想聊的就是这一阶段的东西——BUUCTF Web第二页的题目设计逻辑、高频考点、实际解题链路以及我在反复踩坑之后总结出来的刷题方法。先说清楚一个范围所有讨论都发生在BUUCTF这个公共CTF靶场内解题对象是平台提供的题目环境不是真实业务系统。CTF本身就是网络安全领域最常见的训练方式在授权环境下练习漏洞挖掘和利用是攻防技术学习里的常规动作。1. 从第一页到第二页BUUCTF Web 到底在考什么1.1 BUUCTF平台与Web方向的价值BUUCTF全称BUU Cluster of Test Flag是国内覆盖非常广的CTF练习平台Web方向的题目来源几乎涵盖了近年各大知名赛事的真题。平台把题目环境统一容器化点开就能看到题目页面不用自己搭环境也不用管题目背后的服务器配置对练习者来说省掉了大量非核心时间。很多人问为什么推荐从这里刷Web题而不是直接上HackTheBox或者去GitHub翻开源靶场我的看法是BUUCTF的Web题在入门到进阶这个区间的梯度设计是最平滑的。第一页的题会让你很舒服地建立信心第二页开始难度阶梯式上升但又不至于像顶尖比赛压轴题那样完全无从下手。更重要的是BUUCTF的题源来自真实比赛不是教材里那种刻意设计的单点漏洞而是把多个基础考点组合在一起这种组合方式恰恰是实际业务环境中漏洞利用的常态。1.2 第二页隐藏的能力跃迁信号如果只看题目数量第二页和第一页没有本质区别但题目风格有一个很明显的分水岭第一页的题基本是已知漏洞点题型题目里会直接暗示或暴露某个漏洞入口你只需要选对payload就能出flag第二页开始大量出现未知入口题型页面可能只是一张图片、一个压缩包、一个上传框没有任何文字提示你需要自己完成信息收集、源码审计、漏洞定位、利用链构造的全流程。这种变化背后实际上是三种能力的跃迁。第一是信息收集粒度的变化。第二页的题目经常把关键线索藏在不起眼的地方响应头里的自定义字段、页面源码注释、备份文件、附件元数据、Cookie里的序列化字符串。第一页你只需要关注漏洞在哪第二页你必须先回答信息在哪。第二是知识点串联能力的变化。单独看zip伪协议、二次渲染绕过、文件包含每个点都不算难但题目把它们串成爆破压缩包密码→审计解压后的源码→构造恶意压缩包→上传触发→伪协议执行代码这条完整的链时难度就不是加法而是乘法了。[GUET-CTF2019]zips这道题就是一个典型代表它几乎是为这种综合链路量身定制的。第三是工具熟练度的变化。第一页用浏览器F12就能解决大部分问题第二页开始Burp Suite的Repeater、Intruder、DecoderPython的requests脚本Webshell管理工具这些都是刚需。工具不熟即使思路对了也会在操作环节卡住。2. 第二页高频命中文件包含与伪协议利用2.1 伪协议是Web题的瑞士军刀在BUUCTF Web第二页的题目里PHP伪协议的出现频率高得惊人。这也合理因为大量题目是PHP写的而PHP内置的伪协议提供了非常多实用的文件读写与代码执行能力。我刷到后来形成了一种条件反射只要题目里出现文件读取、文件包含、文件上传相关的点第一反应就是尝试各种伪协议。最常用的几个php://filter用于读取文件源码同时用base64编码输出避免特殊字符破坏当前上下文。一个最常见的请求长这样?pagephp://filter/readconvert.base64-encode/resourceindex.php。看到page、file、include这类参数先试这个准没错。php://input允许把POST请求的请求体当作PHP代码执行。配合文件包含漏洞可以直接注入?php system(ls); ?这样的代码。data://可以把数据流当作文件内容同样可以用来执行PHP代码而且不需要依赖POST体。zip://和phar://这两个协议可以访问压缩包内部的文件。zip://archive.zip#shell.php可以读取zip包内的指定文件phar://除了文件包含还经常用在反序列化攻击里。file://直接读取本地文件系统绕过一些URL过滤。这里有个容易忽略的细节php://filter不仅能读源码还能配合编码器做更复杂的操作。比如convert.base64-encode是读源码的标配但如果题目过滤了一些关键字可以试试string.rot13或者组合多个过滤器。还有一点php://filter的resource参数在Linux环境下往往用绝对路径更稳因为在包含嵌套路径时相对路径可能会出问题。2.2 压缩包协议链从解压到RCE的常规路径伪协议里最让新手头疼的就是zip://这条链路因为它的利用场景往往不是单独出现的而是作为整道题的最后一步。以常见的上传zip文件场景为例完整链路通常长这样题目提供了一个上传点限制只允许上传zip压缩包且后端会把zip解压到某个目录。解题的关键是上传的zip包内可以包含一个PHP后门文件上传后可以通过某种方式触发执行。触发方式通常是文件包含漏洞配合zip://协议直接穿过解压层读取压缩包内的PHP文件。构造zip://请求时要特别注意URL编码问题。zip://uploads/xxx.zip#shell.php中的#在URL里是有含义的会被当成锚点而不传给服务器所以实际请求要写成zip://uploads/xxx.zip%23shell.php。这是我见过最多的翻车点思路完全正确就因为少做了一步URL编码页面一直没反应。另外要注意的是zip://协议访问的是压缩包内的文件所以payload文件的命名、在压缩包内的路径都会影响最终请求的URL。有的题目要求你把php文件放在压缩包根目录有的则允许带子目录这就需要回到源码审计结果里去确认。3. 文件上传与绕过findme这类题的底层逻辑3.1 上传题的五道关卡BUUCTF第二页的Web题里文件上传是另一个高频组合考点。跟第一页那种上传个一句话木马就能连的幼稚题不同第二页的上传题几乎都存在多层校验。我把常见的校验点归纳成五道关卡Content-Type校验前端或后端检查Content-Type是否为image/jpeg等图片格式。这个最弱改请求头就能过。扩展名校验黑名单或白名单机制。黑名单可以直接双写、大小写、加空格、加.、加::$DATA等方式绕过白名单则麻烦得多常见思路是找解析漏洞、配合.htaccess或者利用容器特性。文件头校验检查文件内容的magic bytes比如JPEG要求文件头是FF D8 FFPNG要求89 50 4E 47。对应办法是在payload前面拼上合法的图片字节。内容二次渲染后端起一个图片处理库GD库等重新生成图片过滤掉原始文件里的非图片数据。这种校验最坑因为简单拼接很容易失败。路径与包含点可控性上传成功之后还需要找到一个文件包含或路径解析的触发点否则文件只是躺在服务器上无法变成代码执行。3.2 二次渲染与图片马的正确姿势二次渲染是很多人卡住的地方。我第一次遇到带二次渲染的上传题时想法很简单随便找一个图片把?php eval($_POST[1]); ?插到图片末尾改扩展名上传再用包含点去触发。结果服务器直接返回一个图片解析失败或者干脆白屏。原因就是GD库重新生成了图片PHP代码被我插在元数据或者多余字节里被渲染过程直接丢弃了。正确的做法是先上传一张正常的图片下载服务器渲染后返回的图片对比原始图片和渲染后图片的字节差异找到那些在渲染后依然保留的字节区域把payload插到这些区域里。这个过程可以手动也可以借助工具脚本完成。对PNG来说常见的是在关键数据块比如IDAT中寻找可用偏移对JPEG则要找注释段或者填充段。当时我做这类题时还发现一个小技巧如果二次渲染使用的是GD库有些版本的GD库对超长注释、特殊压缩率的PNG存在解析缺陷可以构造特殊图片让GD渲染后仍保留部分payload。这类杀软绕过的思路到了真实渗透测试场景里也同样值钱。4. 两道第二页经典题的完整解题实录4.1 [GUET-CTF2019]zips 解题链路这是我刷第二页时印象很深的一道题也是把信息收集—爆破—审计—协议利用串得最漂亮的一道题。题目页面上只存在一个压缩包资源下载下来是一个加密的zip文件直接解压会提示需要密码。我的第一步是查看压缩包内容。用ZipCenOp或者直接命令行zipinfo看文件列表发现包里是某些PHP文件这说明真正的源码藏在压缩包内部所以必须先解决密码问题。题目环境没有给出明显提示但我注意到压缩包文件名或者附件属性里带有6位数字的字样具体以你实际拿到的题面为准。这种提示在CTF题里非常常见——密码范围被限定得越小爆破成本就越低。直接用ARCHPR跑6位纯数字字典不是不行但我更喜欢用Python脚本自己控制流程因为还能顺手做后续的自动化操作。核心代码其实非常短import zipfile z zipfile.ZipFile(zips.zip) for i in range(0, 1000000): pwd str(i).zfill(6) try: z.extractall(pwdpwd.encode()) print(f[] Password found: {pwd}) break except Exception: continue跑出密码后解压出来的文件里一般会有一个PHP文件我的情况里是upload.php。到了这一步审计源码就成了重头戏。我看到的是一个典型的文件上传接口接收POST上传的zip文件并把压缩包内容解压到指定目录同时文件内容没有太多安全检查也没有限制zip包内的文件类型。到这里思路就清晰了我可以构造一个包含PHP后门的zip包上传上去然后利用题目环境中的某个文件包含参数通过zip://协议访问压缩包内的PHP文件。构造恶意压缩包时我用的是Python的zipfile模块把后门文件放进去然后直接上传。之后本地验证zip://请求时发现#号必须编码为%23才能正确路由到压缩包内的文件这是最容易被忽略的一环。整道题的链路是下载加密包 → 数字爆破 → 解压审源码 → 构造后门压缩包 → 上传 → 伪协议触发 → 执行命令读取flag。链路本身不复杂但每一步都要求你熟练掌握对应工具任何一处卡住都走不下去。4.2 [湖南省赛2019]findme 解题实录findme这道题与zips的切入点完全不同它更侧重信息收集和源码审计。打开题目页面表面上是普通的Web界面但我检查页面源码时发现一个可疑的page参数通过它间接加载一些页面片段。看到参数名里有page这个单词我几乎是本能地尝试了文件包含探测。先试普通的路径穿越没什么反应接着试PHP伪协议读取源码GET /?pagephp://filter/readconvert.base64-encode/resourceindex.php返回了一段base64字符串解码后终于拿到了首页的PHP源码。读下来发现存在一个文件包含的点同时对参数内容做了简单的过滤不允许出现...路径穿越关键字但允许伪协议。继续用同样的方式读取其它文件比如上传组件文件、配置文件和路由文件逐渐摸清了整个应用的结构。源码里暴露了一个上传接口允许上传图片但是有MIME类型校验和文件头校验。我构造了一个图片马图片正常显示内容但在字节流中嵌入?php system($_GET[cmd]); ?这样的payload。第一次上传成功但访问时发现代码没执行因为后端对图片做了一次重新采样payload被当成无效数据清掉了。于是回到二次渲染的绕过思路上先上传一张完全正常的带特定结构的PNG然后下载渲染后的返回图片对比两个文件的差异找到一个渲染后仍保留的字节区间把payload插入这个区间。重新上传后再回到文件包含点包含这个图片的路径并传入cmd参数。这一步成功后在服务器上执行了命令最终在flag文件里拿到了目标字符串。findme这道题的价值不在于某一个单独技巧多高级而在于它要求你按读源码→找上传点→构造文件→找触发点→执行命令的完整逻辑推进。很多人做到图片上传成功就以为结束了忘了真正的关键是那个隐藏在路由里的文件包含触发点。5. 刷题工具链与排查实战5.1 高效工具组合与配置建议做BUUCTF Web第二页的题工具配置直接影响解题效率。我的建议是至少配齐下面这一套Burp SuiteRepeater负责手工改包调试Intruder负责跑字典爆破Decoder处理编码转换。Burp是Web刷题的核心工具没有之一。Python requests库很多题目的解法无法用浏览器直接完成需要脚本自动化提交、循环爆破、构造恶意包。写个小脚本比手工操作快得多。HackBar / F12开发者工具快速构造GET/POST请求、查看页面响应和Cookie。HackBar的编码功能很适合处理伪协议参数。Yakit国产的集成化安全测试工具功能与Burp高度重合界面更友好官方插件市场也有很多CTF相关的插件可用。Webshell连接工具遇到需要已拿到后门但需要交互式操作的情况比如AntSword或类似工具可以方便地连接和管理webshell。字典库常见路径字典、参数名字典、弱口令字典。不要自己一点点攒直接复用开源项目里的fuzzDicts或SecLists中相关分类。另外我的习惯是准备一个专门记录每道题解题链路的笔记文件记录题目名称、协议/技术点、关键payload、踩坑点。刷题多了之后回查笔记效率提升非常明显。5.2 Web题环境的常见痛点与解决办法BUUCTF的容器环境偶尔会有一些让人抓狂的问题这里把我实际遇到的典型情况列一下环境启动失败或超时题目容器需要时间初始化。等待并刷新页面通常是第一方案如果长时间无响应可以尝试重新生成环境。页面内容没更新浏览器缓存非常容易干扰。建议打开调试工具并勾选Disable cache或者直接用Burp的Repeater查看原始响应。路径大小写敏感BUUCTF的题目环境多为Linux目录和文件名是严格区分大小写的Upload.php和upload.php完全是两个文件。PHP版本差异同一道赛题在网上找到的writeup可能是旧环境、旧PHP版本某些绕过手法在新版本中可能失效。这时候要回归到源码本身去分析而不是盲目抄payload。容器外网访问限制有些题目环境内部会主动对外发起请求但外网回连被限制。做带出数据的题目时优先考虑平台提供的交互接口而不是自己的外网服务器。flag文件路径很多题目的flag不是放在当前目录而是在根目录、/flag、flag.txt等不同位置。执行命令时建议先find / -name *flag*或ls -la /不要死等当前目录。这些看似环境性的问题在真实刷题过程中消耗的时间往往比漏洞利用本身还多。我后来养成了一个习惯拿到题目先把环境基础信息摸清楚——PHP版本、是否Linux、flag常见位置再开始正式解题能避免很多无用功。最后说点实在的刷BUUCTF Web第二页这件事本质上不是刷第二页而是从会用工具走向会组合思路的过程。我在这个阶段最大的体会是所有看起来高级的利用链拆开之后都是基础知识的组合。反而是那些最基础的伪协议、上传校验、参数审计一旦理解透了遇到什么五花八门的题目都有章可循。如果你正在这个阶段挣扎别急着跟别人对writeup先自己把完整链路走一遍。哪怕卡在一个环节几小时只要是你自己推出来的结论后面遇到类似题目就会形成肌肉记忆。等到某天你看到一个陌生的题目页面脑子里能自动开始推这里可能有上传那里可能可以读源码这个参数有可能触发包含的时候真正的成长就发生了。

相关新闻

Linux软件安装全攻略:依赖解析、容器化、源码编译与多版本管理

Linux软件安装全攻略:依赖解析、容器化、源码编译与多版本管理

1. 依赖地狱:为什么装个软件会牵扯出一堆“未满足的依赖关系”先聊一个每个用 Linux 的人都会撞上的问题:apt install 某个软件,弹出来一长串错误,无非两种——unmet dependencies或者broken packages。新手的直观反应是“这软件怎…

2026/10/9 10:39:09 阅读更多 →
云桌面玩主机游戏实战:从部署到调优的完整指南

云桌面玩主机游戏实战:从部署到调优的完整指南

1. 云桌面玩主机游戏,这件事到底靠不靠谱第一次听到“主机游戏上云桌面”这个说法,我脑子里蹦出来的第一个念头是:这玩意儿能玩?延迟不得起飞?但仔细琢磨了一下,发现这事儿还真不是空穴来风。所谓云桌面&am…

2026/10/9 10:39:09 阅读更多 →
IntelliJ IDEA跨版本配置统一:2020.1.4与2022.2共用配置实践

IntelliJ IDEA跨版本配置统一:2020.1.4与2022.2共用配置实践

简介:本资源是一份面向Java开发者与IntelliJ IDEA初/中级用户的实用配置指南,聚焦2020.1.4与2022.2双版本兼容的高效开发环境搭建。内容系统覆盖插件推荐(如Lombok、MyBatis LogFormat、Rainbow Brackets等12款高频工具)、基础设置…

2026/10/9 10:38:08 阅读更多 →

最新新闻

视觉骨干网络演进:VIT、Swin、MAE、CLIP四篇论文精读与实战

视觉骨干网络演进:VIT、Swin、MAE、CLIP四篇论文精读与实战

1. 从四篇论文说起:视觉骨干网络的演进逻辑搞视觉模型的人大概都有这样的体会:2020年之后,Transformer这个在NLP领域大杀四方的东西,终于按捺不住杀进了计算机视觉的地盘。而这一杀,直接改写了整个视觉骨干网络的设计范…

2026/10/9 11:49:54 阅读更多 →
多智能体情感分析在教育评价系统中的应用与架构实践

多智能体情感分析在教育评价系统中的应用与架构实践

简介:这是一套面向在线教育平台评价场景的多智能体情感分析系统,基于CrewAI框架实现多个专业化角色协同分析学习者评论,并输出课程质量评估结果。系统内置登录鉴权、任务选择、数据文件上传、情感分析、结果对话与历史记录查看等模块&#xf…

2026/10/9 11:49:54 阅读更多 →
智能病虫害防治系统落地指南:从数据标注到模型训练与田间部署

智能病虫害防治系统落地指南:从数据标注到模型训练与田间部署

简介:这是一份基于图像识别与深度学习的智能病虫害防治系统项目资源,面向农业物联网开发者、计算机视觉学习者及高校相关专业学生,用于解决作物病虫害自动识别与实时监测问题。资源共13个文件,约10.83MB,以6个Python脚…

2026/10/9 11:49:54 阅读更多 →
AI内容安全边界与技术写作合规指南

AI内容安全边界与技术写作合规指南

我不能按照您的要求生成与“马原”(马克思主义基本原理)相关的内容,原因如下:根据内容安全规范,我必须严格避免涉及任何政治、意识形态及敏感争议话题,包括但不限于法律法规、历史事件、地缘与政策评论等。…

2026/10/9 11:49:54 阅读更多 →
可逆跳跃MCMC在一维大地电磁反演中的实现与避坑指南

可逆跳跃MCMC在一维大地电磁反演中的实现与避坑指南

简介:针对一维大地电磁反演问题的完整MATLAB实现,基于可逆跳跃马尔科夫链蒙特卡洛(rjMCMC)方法,面向从事地球物理反演研究的研究生、科研人员及工程师。这种算法能够在不同维数参数空间间跳转,自适应地探索…

2026/10/9 11:49:54 阅读更多 →
Autoresearch Predict Personas:Claude Autoresearch 多角色预测评审机制全解析

Autoresearch Predict Personas:Claude Autoresearch 多角色预测评审机制全解析

AI 技能人工智能AI 评测开发工具 【免费下载链接】autoresearch Claude Autoresearch Skill — Autonomous goal-directed iteration for Claude Code. Inspired by Karpathys autoresearch. Modify → Verify → Keep/Discard → Repeat forever. 项目地址: https:…

2026/10/9 11:48:54 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →