bugku-No one knows regex better than me

难得开靶场所需要的金币,比完成题目给的少

题目源码

 <?php 
error_reporting(0);
$zero=$_REQUEST['zero'];
$first=$_REQUEST['first'];
$second=$zero.$first;
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){
    $key=$second;
    if(preg_match("/\.\.|flag/",$key)){
        die("Noooood hacker!");
    }else{
        $third=$first;
        if(preg_match("/\\|\056\160\150\x70/i",$third)){
            $end=substr($third,5);
            highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
        }
    }
}
else{
    highlight_file(__FILE__);
} 

看题可知,需要成功匹配preg_match_all,以及第二个preg_match,绕过第一个preg_match.

补充

preg_match_all(),preg_match()两个函数匹配失败返回False

成功则返回匹配的次数

 

最后匹配成功会对输入的first将前5个字符截断,并且对zero,base64解码.

用这个网站(https://regexr-cn.com/)来分析正则表达式

第一个匹配绕过简单,第二个将起输入到上面的网站中知道是\或者.php符合其中之一即可

尝试写payload,post上传,zero=ZmxhZw==&first=Yeedo.php

尝试了好几次不行

打开phpStorm

<?php                               
$php=".php";                        
if(preg_match("/\\|.php/i",$php)){  
    print("yes");                   
}                                   
?>                                  

输出为空?????

 

 发现\\|变成同样颜色了,难道|被转义了?

 

<?php                                                           
$php="|.php";                                                   
if(preg_match("/\\|.php/i",$php)){                              
    print("yes");                                               
}                                                               
?>                                                              

在.php加上|

输出为yes,,,彻底懵了

改写payload,,zero=ZmxhZw==&first=girl|.php

成功输出flag

去百度找到的解释是

执行php语法转义  \\ => \,剩下 \|.php
执行正则语法转义  \| => |,剩下 |.php

posted @ 2022-11-13 21:21  柳大侠  阅读(68)  评论(0)    收藏  举报