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
相关推荐
云半S一4 分钟前
Agent 学习总结一
经验分享·笔记·学习·agent
跨知易知识产权9 分钟前
美国发明专利和外观专利的保护期限分别是多久,外观专利是否需要缴纳维持费?
笔记
今年下半年15 分钟前
【前端】Vue2 项目 ECharts 统计图表组件封装与使用实践(附组件源码)
前端·javascript·echarts
八月的雨季 最後的冰吻17 分钟前
C++ 面试要点笔记(续)
c++·笔记·面试
西索斯coding24 分钟前
在 中接入 教程:p配置、m填写、扩展思考参数一篇就够(2)
java·前端·javascript·ai
hunterandroid26 分钟前
Android ViewModel + LiveData 工程实践:配置变更、一次性事件与状态恢复
android
代码猎人27 分钟前
前端怎么优化项目基础架构
前端
__sjfzllv___35 分钟前
在职前端Leader学习/转行 AI Agent -DAY78
前端
代码猎人35 分钟前
前端怎么封装工具类
前端
deli00738 分钟前
PDF 合并别再用在线工具:12 份文件浏览器里合完,实测不上传
前端