PKWCTF2026-Web部分题解
字数 3878
更新时间 2026-10-25 20:01:43

PKWCTF2026-Web部分题解

一句话结论:这是一份 Web 方向的多题速解,题量碎、每题只点一招;本文把它重排成一份「按漏洞类别归档的成因与加固速查」,凡可直接照抄的利用参数、载荷、脚本与 flag 一律剔除,只保留每类漏洞的成因、被触发的条件、以及对应的加固与检测要点。

排版说明:正文按漏洞类别而非题号组织,每类给「成因 / 触发条件 / 加固与检测」;引号统一用直角引号,公式一律写成纯文本(不上 LaTeX),代码内双引号改单引号,路径与头部字段以无转义写法呈现。

一、权限与访问控制配置错误

SUID 位落到非预期二进制

成因:提权题里先发现当前权限不足、需要更高身份,再枚举带特殊置位属性的可执行文件,找到一个非标准命名的程序——这类文件无论谁执行都以属主身份运行,于是把一个「看起来无害的小工具」变成了越权入口,再叠加它对空格与关键词的过滤可用编码方式绕过。加固与检测:定期审计带特殊置位的二进制白名单,去掉业务不需要的这类标志位;对以高身份运行的程序做参数严格白名单、禁止把用户输入拼进命令或文件路径;主机侧检测盯「非常见路径下新出现的带置位文件」和「以该文件派生的异常子进程」。认知点是——凡是「以特权身份运行、却接受不可信输入」的程序,本身就是一个提权面。

接口只校验单条、不校验批量

成因:某处只对「登录」这类单条请求做了鉴权校验,对批量/多条查询接口完全没校验,导致绕过单点防护直接读到越权数据。加固与检测:鉴权必须落在数据访问层、对每一个查询入口统一生效,而不是只在登录或写接口前置;对「列表/批量/详情」这类读接口同样要做对象级权限校验(防止改一个 id 就读别人数据);检测侧对未带会话却命中敏感读接口的请求直接告警。

敏感操作接口缺鉴权(重置类)

成因:教师(高权限角色)的密码重置接口没有做鉴权,低权限角色直接调用重置、拿到高权限身份。加固与检测:任何改密、重置、提权、绑定类接口都必须校验「调用者是否有权操作目标对象」,且校验身份、不只校验「是否登录」;重置流程要二次验证、且验证因子与目标账号绑定;检测侧对「非管理入口发起的重置调用」「重置后角色跃变」做审计。

前端约束形同虚设

成因:某题把表单字段上的禁用属性删掉就能提交本不该由客户端控制的值——凡是只在浏览器侧做的限制(禁用、只读、隐藏、下拉可选值)都可被绕过。加固与检测:客户端约束只作体验优化,服务端必须重做一遍完整性与权限校验;对「客户端可控却影响业务的字段」(金额、角色、状态、库存)在服务端以权威数据源覆盖,绝不信任入参。

HTTP 方法未按需限制

成因:接口只实现了预期方法,却对其它方法(如写入类方法)未做限制,意外触发了未暴露的处理分支。加固与检测:路由层按资源显式声明允许方法、其余一律拒绝;关闭不需要的分布式写方法与调试类方法;在网关/WAF 侧对非常用方法统一拦截并记录。

二、代码与命令执行类

反射存储型脚本注入打点取证

成因:一个管理页面把用户可控内容原样渲染进脚本上下文,提示极明显,注入后可在目标浏览器里以该会话身份回显敏感页(甚至把后端源码/凭证带出)。加固与检测:输出按上下文分别做实体化与编码,严禁把不可信数据拼进脚本;内容安全策略收紧脚本来源;对管理/客服这类高权页尤其要做注入防护。检测指纹是「某可控字段被回显进了可执行上下文」。要点:注入拿到的若是后端源码,则属信息泄露叠加越权,应连同源码暴露一起修。

上传配置覆写改变解析行为

成因:允许上传某类服务器配置文件、并在其中把指定后缀声明为脚本执行,从而让上传的「数据文件」被当成代码跑起来。加固与检测:上传目录禁止写入可改变解析策略的配置;上传与执行目录分离、上传卷以不执行挂载;对上传文件做真实类型(魔数)校验而非信任后缀;最小化目录写权限。

模板注入未过滤

成因:把用户输入直接当作模板字符串渲染,未做任何过滤,于是模板语法被执行。加固与检测:绝不用不可信输入去渲染模板;必须渲染时走沙箱/受限上下文并禁用可访问对象图与文件/执行的内置;把输入当纯文本、走变量绑定而非模板求值。

文件包含叠加日志注入

成因:一个页面接受文件参数做包含,先尝试正常的相对包含验证「可控」、再转向把不可控内容写进服务器日志、最后包含该日志文件让其中内容被执行。加固与检测:文件参数走白名单映射、禁止任意路径与穿越;对写进日志的字段做过滤/转义、尤其对换行与脚本定界符;包含根目录锁定、关闭远程与伪协议包含。检测侧「文件参数出现路径分隔或伪协议特征」「包含目标指向日志/会话存储路径」都是强信号。

反序列化对象链

成因:把不可控输入反序列化成对象、触发魔术方法串成调用链,最终以某高权类的方法收尾。加固与检测:不对不可信数据做反序列化(尤其原生序列化格式);用带类型约束的数据交换(如仅数据不携带类型行为的格式)替代;收敛可实例化的类白名单;升级依赖以关闭已知 gadget。要点:链的可达性取决于「可被实例化的类集合」,收敛类加载面即断链。

三、注入类(SQL 与外部实体)

布尔盲注

成因:查询把不可信输入拼进语句,页面差异回显出条件真/假,逐位推断即可。加固与检测:一律参数化查询、禁止字符串拼接;最小数据权限与错误屏蔽(别把数据库错误细节回显给客户端);对「大量近似、逐字符推进的查询」这类速率与模式异常做告警。

宽字节注入

成因:连接字符集与转义方式配合出错,使一个转义字节被前一个多字节字符「吞掉」、单引号逃逸成功。加固与检测:用正确的连接层字符集配置(而非在应用里手工转义叠加);坚持参数化,转义永远不要作为唯一防线;统一编码栈,避免「转义按单字节、解码按多字节」的不一致。

外部实体注入

成因:解析 XML 时允许外部实体,进而读取本地文件或发起服务端请求。加固与检测:解析器关闭外部实体与文档类型定义;只需取数据时用不带实体能力的解析模式;对确需解析的不可信 XML 做大小与深度限制、并屏蔽网络型实体。

四、认证、会话与数据校验绕过

弱类型比较导致的逻辑绕过

成因:某些语言的真值判断把空串、字符串零、整数零、空数组等都判为「空」,或把特定类型的比较当作相等,于是「票据取某个极特殊的空/零值」反而通过了「非空即有效」的校验。加固与检测:校验用严格比较与明确的类型/格式约束(长度、字符集、算法前缀),别依赖「是否为空」这类宽松真值;对令牌/会话做签名与有效期校验、并显式拒绝空值与零值;单元测试覆盖空串、零、假值、空数组这些边界。

编码变体绕过边界防护

成因:会话令牌被前置防护拦截,改用编码/进制变体(如某语言的十六进制转义写法、科学计数法表示、或对哈希比较做特殊绕过)躲过文本型规则。加固与检测:防护要「解码后再判定」,规则匹配不能只针对单一字面形态;对令牌/参数做规范化(统一解码、统一类型)后再比对;哈希比较用固定长度与常量时间比较、避免脆弱等价。认知点是——凡「防护看字面、后端看解码后」的组合都存在绕过空间,规范化必须前置。

服务端信任客户端可控的转发头

成因:业务风控拿转发类请求头当作可信来源,而该头由客户端可任意改,于是伪造来源即可绕过「按来源限领/限流」之类的规则。加固与检测:来源判定只信由可信代理写入、且经服务端覆盖式追加的字段,绝不直接信任客户端传入的同名头;风控键用会话/账号等服务端已知身份,而非可伪造的头;反向代理必须清洗并重写外部传入的转发头。

五、源码与敏感信息泄露

版本库对外可拉取

成因:站点把版本控制目录暴露在 web 根下,可用工具把历史整体拖下来,还原出未发布的敏感文件与接口。加固与检测:web 根禁止放置或暴露版本控制目录、发布走「干净导出」而非直接检出工作副本;对这类目录的访问在入口层统一封禁并监控特征请求。

不可见字符与隐蔽逻辑

成因:源码里藏不可见字符或注释型分隔,使「看似相等」的两段其实不同,靠肉眼审计会漏、需借助能显示码点的工具或在运行时环境里还原。加固与检测:代码审查工具要能显示不可见码点、CI 里做编码/空白规范化检查;对关键比较(口令、令牌、路径)用规范化后的严格比对,避免被不可见差异或等价形式绕过。

备份与遗留文件、弱口令可爆破

成因:目录里遗留字典、备份、未鉴权的内部页面,或可爆破的弱口令入口,直接给出凭证。加固与检测:上线清单里强制移除备份、示例、字典与调试页;目录列表关闭、避免敏感文件可枚举;登录侧上强口令策略、速率限制与锁定,杜绝可被离线字典命中的弱口令。

六、横向小结

这份速解几乎把「Web 常见成因」各点了一遍,抽出来是三条加固母题。其一,权限与校验必须落在服务端且对每个入口统一生效——前端约束、单条校验、来源头信任、方法未限制,本质都是「该在服务端做的判定被放错了位置或只做了一半」。其二,解释器/解析器的行为面是重灾区——模板渲染、反序列化、XML 实体、文件包含、日志注入、宽字节,全部源于「把不可信输入当作代码或结构去解析」,根治办法是不要拿不可信数据去触发解析能力,并用白名单与沙箱收敛可执行面。其三,凡「防护看字面、后端看解码后」或「宽松真值/等价比较」都会留绕过空间——规范化必须前置、比较必须严格、令牌必须签名且拒空值。检测侧则共性极强:对「可控字段进入可执行上下文」「文件参数含路径/伪协议」「逐字符推进的高频查询」「外部传入的转发头被直接采信」「版本库/备份目录被访问」这几类特征做专门告警,能把这份题解里一半以上的招数在进入利用前就拦下。

相似文章
相似文章
小程序二维码
 全屏