【CTF】强网杯2025 Web赛题精解:从代理头注入到条件竞争提权

【CTF】强网杯2025 Web赛题精解:从代理头注入到条件竞争提权 1. 代理头注入漏洞实战解析这道题目的核心在于利用Go语言reverse proxy的特性绕过JWT验证。我们先来看下题目环境系统使用Go的httputil.ReverseProxy作为中间件代理后端是Flask应用。关键点在于X-User这个请求头决定了用户身份验证。我最初尝试伪造JWT token时遇到了困难因为无法获取secret key。后来通过阅读Go源码发现了一个关键特性ReverseProxy会移除逐跳头部(Hop-by-Hop Headers)。这个机制原本是为了符合HTTP协议规范但在这里成了突破口。具体操作是这样的构造一个包含Connection: close,x-user的请求头。当代理处理这个请求时会根据Connection字段的值移除x-user头部。这样后端Flask收到的请求就不包含X-User头系统会默认分配uid0也就是admin身份。GET /dashboard HTTP/1.1 Host: target.com X-User: 1 Connection: close,x-user代理处理后转发给后端的请求会变成GET /dashboard HTTP/1.1 Host: target.com这个技巧在实际渗透测试中很有价值特别是遇到多层代理架构时。我在测试某企业系统时就遇到过类似场景通过精心构造的Connection头部成功绕过了WAF的检测。2. PHP反序列化漏洞深度利用第二个题目ezphp展示了PHP反序列化的经典利用链。我们先分析下test类的结构class test { public $readflag; public $f; public $key; public function __construct() { $this-readflag new class { // 匿名类实现 }; } public function __destruct() { // 关键执行点 } }这个类的设计有几个危险点__destruct方法中直接调用动态函数匿名类中包含文件上传功能整个对象通过GET参数反序列化我构造的攻击链分为三步通过反序列化触发__construct创建文件上传handler利用条件竞争上传webshell调用readflag方法实现文件包含这里最巧妙的是利用了时间种子生成随机文件名的特性。由于文件名基于当前分钟数生成在同一分钟内上传的文件名是可预测的。这就为条件竞争创造了条件。3. 文件上传条件竞争实战文件上传的限制主要有文件名格式时间.随机字符串.jpg内容过滤不能包含?、://等PHP特征我的绕过方法是同时发起两个上传请求第一个上传合法文本文件第二个上传PHP webshell在文件被删除前快速包含// 合法文件内容 ?php // 这里放无害内容 ? // webshell内容 ?php system($_GET[cmd]); ?通过Burp的Intruder模块可以自动化这个过程。关键是要把握好时间窗口通常需要20-30个并发请求才能成功。在实际测试中我发现成功率与服务器负载密切相关高峰期更容易成功。4. SUID提权技巧详解拿到webshell后发现无法直接读取flag需要提权。常用的SUID提权方法有find / -perm -us -type f 2/dev/null这道题中发现了base64命令具有SUID权限这是个经典的提权点。利用方法是./base64 /flag | base64 -d为什么base64会有SUID权限很多开发者为了方便会给一些文本处理命令设置SUID位这其实是非常危险的做法。我在企业渗透测试中就遇到过因为不当的SUID设置导致整个系统沦陷的案例。5. 完整攻击链复现让我们把整个攻击流程串起来通过代理头注入获取管理员身份找到反序列化入口点构造特殊的序列化数据触发文件上传功能利用条件竞争上传webshell通过文件包含执行命令查找SUID程序提权最终获取flag每个环节都需要精心设计特别是在真实环境中可能会遇到更多防护措施。建议在本地搭建测试环境反复练习掌握每个技术点的细节。6. 防御方案建议针对这类攻击我总结了几点防御建议代理服务器要严格过滤Connection头部PHP反序列化要使用白名单机制文件上传要使用不可预测的随机文件名定期检查系统SUID程序关键操作要增加二次验证在实际开发中安全应该贯穿整个生命周期。我在代码审查时就会特别注意这些风险点建议团队建立完善的安全开发规范。7. 调试技巧分享在解决这类复杂题目时我常用的调试方法使用tcpdump抓包分析请求变化在关键函数添加日志输出搭建本地环境单步调试使用xdebug分析PHP执行流程编写自动化测试脚本验证猜想特别是对于条件竞争这类时序敏感的问题自动化测试脚本能大大提高效率。我通常会先用Python写个简单的多线程脚本快速验证思路是否可行。8. CTF解题心得参加多年CTF比赛后我总结了一些经验仔细阅读题目描述和源码注意观察非常规的技术实现善用搜索引擎查找类似漏洞保持耐心复杂题目往往需要多次尝试做好笔记记录每个发现和尝试这道题目很好地融合了多种技术点考察了选手的综合能力。建议新手可以从简单题目开始逐步提升难度同时要注重基础知识的积累。Web安全涉及面广需要持续学习和实践。