题目
打开题目所给链接直接看到一串php代码,将其复制下来分析:
可以看出,flag似乎隐藏在flag.php的文档里,需要调用highlight_file()函数来显示
这串代码种考察了php正则表达式的应用,preg_match('ppp',string)和preg_match_all('ppppp',string)都是正则表达式的匹配函数
正则表达式表现形式:类似‘/php/’,即字符串前后加上两条斜杠即可
其中'|'表示左边或者右边匹配任一字符串即可
'/..../i'其中'i'是修饰符,表示匹配不区分大小写
因此若要实现highlight_file(flag.php),需要使得
$zero=base64.encode('flag')='ZmxhZw==',
$end='.php'
从而需要使得$third满足:
1、匹配正则表达式:'/\\|\056\160\150\x70/i',即$third内包含字符串"\|.php",\这里表示特殊字符
2、$third自第五位(不包括第五位)往后的字符串是".php"
根据判断条件
if(preg_match("/\.\.|flag/",$key)){
die("Noooood hacker!");
}else{
$third=$first;
...
可知,$first需要满足以上两个条件,并$key不能与'/\.\.|flag/'匹配,相当于$key中不能包含字符串".."与"flag",又由于知道$key=$second=$zero.$first,根据第一个判断条件
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){
$key=$second;
...
}
else
{
highlight_file(__FILE__);
}
可以得出,需要满足判断条件,即需要使得$second包含Yeedo|wants|a|girl|friend|or|a|flag中的任意字符串;
已知$zero=ZmxhZw== ,$first满足以上两个条件
$second=$zero.$first="ZmxhZw==".$first要满足:
1、包含Yeedo|wants|a|girl|friend|or|a|flag中的任意字符串;
2、不包含字符串".."和"flag";
3、$first内包含字符串"\|.php",\这里表示特殊字符;
4、$first自第五位(不包括第五位)往后的字符串是".php"。
可以使得$first=or??|.php,此时将满足所有判断条件
即上传?zero=ZmxhZw==&first=or??|.php可以得到最终结果