ctf show web入门91

这道题非常经典,考查的是 PHP 正则表达式修饰符(Modifiers)的特性差异以及换行符绕过。

我们的目标是让代码执行到 else { echo flag; }。也就是说,我们需要让输入的参数 a满足以下两个条件:通过第一个检测:pregmatch(′/phpa 满足以下两个条件: 通过第一个检测:preg_match('/\^phpa满足以下两个条件:通过第一个检测:pregmatch(′/php/im', a)必须为True。绕过第二个检测:pregmatch(′/phpa) 必须为 True。 绕过第二个检测:preg_match('/\^phpa)必须为True。绕过第二个检测:pregmatch(′/php/i', a) 必须为 False。

  1. 核心代码与正则表达式分析
    我们来对比一下这两个 preg_match 的正则表达式有什么不同:
    第一个正则表达式:'/^php/im' /i:忽略大小写。 /m:多行模式(Multi-line mode)。 在多行模式下,\^ 不仅匹配字符串的开头,还匹配每一行的开头(即换行符 \\n 之后的位置)。 不仅匹配字符串的结尾,还匹配每一行的结尾(即换行符 \n 之前的位置)。
    这意味着:只要你的输入中,有任意独立的一行内容完全是 "php",就能触发 True。例如 "abc\nphp\ndef" 就可以匹配成功。
    第二个正则表达式:'/^php/i' /i:忽略大小写。 注意:这里没有 /m 修饰符(默认是单行模式)。 在默认模式下,\^ 只能匹配整个字符串的绝对开头。 匹配整个字符串的结尾(或者是字符串末尾的换行符之前)。
    这意味着:它要求你的整个输入字符串极其严格,除了 "php"(或其大小写变体)之外,不能有其他多余的行或字符。
  2. 绕过思路
    既然第一个正则支持多行匹配,而第二个正则不支持,我们就可以利用 换行符(\n,URL编码为 %0a) 来构造攻击载荷(Payload)。
    我们需要构造一个字符串,使得它包含多行,其中有一行是 php:
    构造结构:换行符 + php 或者是 php + 换行符 + 任意内容
    分析原理:
    比如我们输入 %0aphp(即一个换行符后面跟着 php)。
    第一个正则 (/im):因为有换行符,它把字符串看作两行。第二行是 "php",完全符合 /^php/,匹配成功,进入内层循环。第二个正则(/i):因为它没有/m,它把/,匹配成功,进入内层循环。 第二个正则 (/i):因为它没有 /m,它把 %0aphp 当作一个整体。由于绝对开头是一个换行符而不是 p,所以 ^php/,匹配成功,进入内层循环。第二个正则(/i):因为它没有/m,它把 匹配失败,直接走到 else 分支,输出 $flag。
  3. 最终构造 Payload
    在 URL 中,换行符 \n 需要进行 URL 编码,对应的编码是 %0a。
    你可以尝试以下任意一种构造方式:
    方式一(开头加换行)payload:?cmd=%0aphp

    方法二(结尾加换行和任意内容)payload为:?cmd=php%0aa
相关推荐
欢欢李11 小时前
【LTE L3 笔记 06】LTE下行参考信号
笔记·无线通信·物理层·lte·空口协议
陈随易15 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
Csvn18 小时前
性能监控
前端
前进的李工19 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
Csvn19 小时前
构建工具
前端
FRing0319 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
三少爷的鞋20 小时前
Android 架构七条铁律:架构师真正设计的不是代码,而是秩序
android
蒸蒸yyyyzwd21 小时前
后端学习笔记三个知识
笔记·八股
kyriewen21 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
xiangxiongfly9151 天前
Android GsonFactory总结
android·gson·gsonfactory