web 91

payload: ?cmd=php%0a1 

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';
}

^表示匹配开始,$表示匹配结束

/i 表示匹配的时候不区分大小写;

/m 表示多行匹配,什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号

 首先需要匹配到的是一行php,因为有/m,所有可以带换行符,第一次匹配到第一行php就算匹配成功,进行下一轮正则。

就可以放过,进行下一次的匹配,第二次的匹配不带/m所以可以匹配到所有的字符,匹配到的是:

php

11

因此不满足正则条件,下放到else中输出flag

更多推荐

ctfshow web入门 PHP特性学习笔记91