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
相关推荐
沐怡旸1 小时前
深入解析 Android Performance Analyzer (APA) 底层架构与技术原理
android
天渺工作室2 小时前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
阳光是sunny2 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
ZhengEnCi2 小时前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
九酒3 小时前
AI Agent 开发踩坑记:口播功能非得用 APP 原生实现吗?
前端·人工智能·agent
Jackson__3 小时前
做了一段时间的AI coding后,我终于搞清了 CLI 和 MCP 的区别
前端·agent·ai编程
IT_陈寒6 小时前
JavaScript项目实战经验分享
前端·人工智能·后端
用户47949283569157 小时前
6w star,GitHub 趋势第一的 Ponytail,这个agent插件到底在火什么
前端·后端
薛定喵的谔8 小时前
我开源了一个精致的 Next.js 博客模板:Skyplume
前端·前端框架·next.js
李斯维9 小时前
从历史的角度看 Android 软件架构
android·架构·android jetpack