题目
<?php
error_reporting(0);
$flag = 'flag{test}'; // 自定义了一个flag
if ("POST" == $_SERVER['REQUEST_METHOD']){ // 判断当前http的请求的方法
$password = $_POST['password']; // 接受post参数名为password的值
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)){ //preg_match 正则表达式匹配 至少十二位 非空格非TAB之外的内容
echo 'flag';
exit;
}
while (TRUE){
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; // 四种类型的正则
if (6 > preg_match_all($reg, $password, $arr)) // 要匹配到6次
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt){
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
//>=3,必须包含四种类型三种与三种以上
if ("42" == $password) // 最后password还需要等于42
echo $flag;
else echo 'Wrong password';
exit;
}
}
答案:
首先传入的参数要大于12个字符,必须是非空格非TAB之外的内容,password要有大小写数字,字符内容,而且匹配到的次数要大于6次,最后password要等于42
要满足上面的条件 要么是16进制要么是科学计数法,因为正则表达式需要满足6次或者6次以上所以这里16进制不满足要求
payload:42.000000000e+0