基于科学记数法的绕过

题目

<?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

猜你喜欢

转载自blog.csdn.net/q1352483315/article/details/89765551