第十届“强网杯”全国网络安全挑战赛初赛Web&ReverseWP(二)"

admin 2026-11-02 15:07:11 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

第十届“强网杯”全国网络安全挑战赛初赛Web&Reverse WP(二)

原创

星宇Sec
星宇Sec

星宇Sec

2026年11月1日 19:45
山东

去阅读

Web & Reverse

为深入贯彻习近平总书记关于网络强国的重要思想,特别是习近平总书记关于网络安全工作“四个坚持”的重要指示精神,贯彻落实全国网络安全和信息化工作会议精神,创新网络安全人才培养模式,在中央网信办、河南省人民政府指导下,河南省委网信办、河南省教育厅、郑州市人民政府、信息工程大学、郑州大学联合主办第十届“强网杯”全国网络安全挑战赛,并于今日12:00正式完赛。

本次强PWN杯线上初赛共41道题目,其中Misc%206道、Crypto%206道、Reverse%203道、PWN%2017道、Web%209道。按比赛解题总榜数据,各题解出队伍数如下:

  • Misc(6道)

  • 宇宙微波背景辐射:801队

  • 0perator:285队
  • NeuronShuffle:630队
  • 谍影重重7:406队
  • Dreambound:429队
  • 问卷调查:895队(非技术题)

  • Crypto(6道)

  • frozen:874队

  • vmshare:899队
  • hoRRibleRing:606队
  • zkRSA:210队
  • crp-12025:272队
  • crp-11741:0队

  • Reverse(3道)

  • ELFStudy:1434队

  • firmware:438队
  • license:473队

  • PWN(17道)

  • babel:414队

  • babyark:399队
  • babysilent:538队
  • babystar:329队
  • Babyv8:282队
  • bad\_puppet:180队
  • Blackout:167队
  • drywell:215队
  • easytl:1059队
  • HESEUS:196队
  • oldsvr:605队
  • ez\_qemu:191队
  • CanonicoPWN:264队
  • hexachord:10队
  • What%20The%20Fox!:161队
  • shadowledger:273队
  • Ironclad:60队

  • Web(9道)

  • BlindReview:12队

  • cwp:1340队
  • ezphp:760队
  • ezstar:279队
  • ezcms:467队
  • Crack%20a%20Little%20Smile:231队
  • fault\_web\_and\_fault\_hash:133队
  • vaultlink:1065队
  • vaultlink\_revenge:150队
第十届“强网杯”%20Web%20与%20Reverse%20方向题解合集

本文整理本次比赛Web与Reverse方向的题目,按Web、Reverse顺序合并。

Web2-cwp 1.%20题目信息
项目 内容
分类 Web
形态 混合题(容器+附件)
附件 blog-src\_7827b45b9013e92261f86a1150f32462.zip
目标 容器

Flag:flag{动态容器已脱敏}

2.%20题目分析

本题为一个PHP博客系统,完整利用链如下:

bulk%20批量执行器数组错位
 %20->%20绕过参数声明与路由限制
 %20->%20触发%20SQL%20注入
 %20->%20利用快照%20hook%20重放伪造%20staff%20身份
 %20->%20写入%20PHP%20文件获得服务账户权限
 %20->%20攻击内网管理服务
 %20->%20伪造高权限会话并命令注入
 %20->%20以%20root%20身份读取目标文件

核心问题并非单一漏洞,而是执行器、鉴权、缓存和内部服务之间可以串接的信任边界错误。

应用结构

SimpleBlog是一个单体PHP应用,源码可大致分为四层:

  • 入口与路由层:单一入口接收请求,按route查表匹配处理器,并声明该处理器允许接收的参数;
  • 处理器层:文章、标签、评论、用户等资源各自实现列表、详情、创建等动作;
  • 数据层:文章以entry为实体,另有changeset(变更集)、snapshot(快照)以及按id索引的行缓存;
  • 扩展层:hooks按status_kind组合派发副作用,后台提供皮肤模板编辑与用户管理。

文章实体的关键字段为:

id,%20title,%20slug,%20owner,%20excerpt,%20created_at,%20status,%20kind,%20parent,%20snap_stale

其中status与kind并非展示字段,而是业务状态机的输入:snap_stale%20=%201表示该行缓存与快照不一致、需要修复,修复完成后按status_kind触发hook。这一设计把\"读数据\"与\"执行副作用\"绑定在一起,是整条利用链的枢纽。

批量接口

/api/bulk允许一次提交多个操作,每个操作包含route、verb、data,外层另带policy(如best-effort)。执行器分三步:绑定(把route解析成处理器)、校验(比对参数声明)、执行。问题在于绑定与校验的结果被写进两个独立数组,而执行阶段仍用原始下标读取,于是\"构建失败的操作\"成了数组错位的支点。

信任边界

链上共有六个可以互相击穿的边界:

  1. 批量执行器与路由声明之间——错位使未声明参数抵达处理器;
  2. 处理器与SQL之间——类型分支不一致导致注入;
  3. 缓存与业务语义之间——伪造行可以驱动hook;
  4. 全局发布身份与真实认证之间——身份可被hook临时改写;
  5. 后台与文件系统之间——模板内容原样落盘为可执行脚本;
  6. 博客容器与内网管理服务之间——会话解析、权限判断与shell拼接均可控。

每步的产出恰好是下一步的输入:注入产出伪造行,伪造行产出staff身份,staff身份产出可写文件,文件产出容器内命令执行,容器内访问权限最终指向管理服务。因此本题的关键不是\"找到某个漏洞\",而是理解这些边界为何能被串联。

3.%20解题过程

本节按因果顺序展开,重点说明每一步\"为什么能进入下一步\"。

Bulk执行器的数组错位

系统存在公开的批量操作入口,内部通过路由表把每个操作分发给对应handler。构建操作时,如果parse_url()返回false,该操作会被记录为错误:

if ($u%20=== false)%20{
 %20  return [\"err\" =>%20op_err(\"route_unparseable\")];
}