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
相关推荐
YF02111 小时前
Android App 高效升级指南:OkDownload 多线程断点续传与全版本安装适配
android·okhttp·app
Genevieve_xiao1 小时前
【xjtuse】【数学建模】课程笔记(二)代数模型、微积分模型(上)
笔记·数学建模
YAwu111 小时前
JavaScript 作用域与执行机制深度解析
前端·javascript
huangliang07031 小时前
MySQL 中的 distinct 和 group by 哪个效率更高?
android·数据库·mysql
程思扬1 小时前
Android 悬浮窗状态错乱终极解决方案:告别 onResume
android·网络
暗不需求1 小时前
深入理解 React 受控组件与非受控组件:从源码到面试
前端·react.js·面试
Yue1681 小时前
天津理工大学前端组大一末期考核随记(2)
前端·javascript
冰凌时空1 小时前
Swift 类型系统入门:从 Int、String 到自定义类型
前端·ios·ai编程
hexu_blog1 小时前
前端vue后端java+springboot如何实现pdf,word,excel之间的相互转换
java·前端·vue.js·spring boot·文档转换