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
相关推荐
蒸蒸yyyyzwd3 分钟前
CPP选手秋招准备学习笔记day25
笔记·学习
bjzhang7519 分钟前
使用HTML+CSS美化上传进度条展示
前端·css·html
事圆则缓20 分钟前
Kotlin 高阶工程化与 Android 深入实践
android·开发语言·kotlin
zhangphil24 分钟前
AI大模型生成maxTokens 与上下文context
android·llama
何以解忧,唯有..26 分钟前
Vue 3 响应式核心:ref() 与 reactive() 的深入解析与实战
前端·javascript·vue.js
淡淡的香烟27 分钟前
Androidiot开发之猫脸识别
android·物联网
晴天1630 分钟前
Chrome DevTools Protocol(CDP)分享-Day36
前端·chrome·chrome devtools
风骏时光牛马31 分钟前
程序员的职场成长:技术之外,更要修炼底层思考力
前端
YWL32 分钟前
CSS变量与预处理器
前端·css
2501_9151063238 分钟前
iOS数据采集技术详解:从性能监控到崩溃分析的全链路实践
android·ios·小程序·https·uni-app·iphone·webview