ApachePHP/5.4.45正则表达式

0x01 源码

  1. <?php
  2. show_source(__FILE__);
  3. include('flag.php');
  4. $a=$_GET['cmd'];
  5. if(preg_match('/^php$/im', $a)){
  6. if(preg_match('/^php$/i', $a)){
  7. echo 'hacker';
  8. }
  9. else{
  10. echo $flag;
  11. }
  12. }
  13. else{
  14. echo 'nonononono';
  15. }

这里有有两个条件,第一个需要是php,第二个又不可以php,不过有个差距就是m模式,/m代表匹配多行数据,这里可以通过%0a进行绕过。传入cmd=”\nphp”

0x02 Payload

  1. ?cmd=%0aphp

0x03 正则表达式中模式修正符作用详解

什么是模式修正符?

  1. 模式修正符就是几个字母,我们在每个正则表达式中可以一次使用一个,也可以连续使用多个,每一个具一定的意义。
    2.模式修正符是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展。
    还记得正则表达式的那个公式吗?’/原子和元字符/模式修正符’,其中正斜线为边界符。

模式修正符的构成

模式修正符就是字母,只不过这些在模式修正符的应用之中有特殊的含义。下面我来看看都有哪些模式修正符,请看下表:

模式修正符 说明
i 不区分大小写的匹配
m 将字符串视为多行,不管是那行都能匹配
s 将字符串视为单行,换行符作为普通字符;元字符中的”.”表示为换行符号
x 将模式中的空白忽略
e 配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行;
A 强制从目标字符串开头匹配;
Z 以模式字符串结尾,相当于元字符$
U 只匹配最近的一个字符串;不重复匹配;

拓展

  1. <?php
  2. show_source(__FILE__);
  3. include('flag.php');
  4. $a=$_GET['cmd'];
  5. if(preg_match('/^.php$/is', $a)){
  6. if(preg_match('/^.php$/i', $a)){
  7. echo 'hacker';
  8. }
  9. else{
  10. echo $flag;
  11. }
  12. }
  13. else{
  14. echo 'nonononono';
  15. }

Payload

  1. ?cmd=%0aphp

参考资料

https://blog.csdn.net/qq_46091464/article/details/108278486