0x01 源码
<?phpshow_source(__FILE__);include('flag.php');$a=$_GET['cmd'];if(preg_match('/^php$/im', $a)){if(preg_match('/^php$/i', $a)){echo 'hacker';}else{echo $flag;}}else{echo 'nonononono';}
这里有有两个条件,第一个需要是php,第二个又不可以php,不过有个差距就是m模式,/m代表匹配多行数据,这里可以通过%0a进行绕过。传入cmd=”\nphp”
0x02 Payload
?cmd=%0aphp
0x03 正则表达式中模式修正符作用详解
什么是模式修正符?
- 模式修正符就是几个字母,我们在每个正则表达式中可以一次使用一个,也可以连续使用多个,每一个具一定的意义。 
2.模式修正符是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展。
还记得正则表达式的那个公式吗?’/原子和元字符/模式修正符’,其中正斜线为边界符。 
模式修正符的构成
模式修正符就是字母,只不过这些在模式修正符的应用之中有特殊的含义。下面我来看看都有哪些模式修正符,请看下表:
| 模式修正符 | 说明 | 
|---|---|
| i | 不区分大小写的匹配 | 
| m | 将字符串视为多行,不管是那行都能匹配 | 
| s | 将字符串视为单行,换行符作为普通字符;元字符中的”.”表示为换行符号 | 
| x | 将模式中的空白忽略 | 
| e | 配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行; | 
| A | 强制从目标字符串开头匹配; | 
| Z | 以模式字符串结尾,相当于元字符$ | 
| U | 只匹配最近的一个字符串;不重复匹配; | 
拓展
<?phpshow_source(__FILE__);include('flag.php');$a=$_GET['cmd'];if(preg_match('/^.php$/is', $a)){if(preg_match('/^.php$/i', $a)){echo 'hacker';}else{echo $flag;}}else{echo 'nonononono';}
Payload
?cmd=%0aphp
