题目:http://120.24.86.145:9009/21.php
第6行使用正则匹配如果匹配到$password开头12个字符中有空格则输出flag并执行exit;
12行是正则匹配$password里的字符是否大于6,如果小于则echo hello world然后break所以一定要大于6才行。
19-28行是表示要将$password里使用正则匹配,满足达到3次或三次以上(也就是说$password里要有满足正则的三个要求)
最终的还要求$password等于42
1 <?php 2 error_reporting(0); 3 $flag = 'flag{test}'; 4 if ("POST" == $_SERVER['REQUEST_METHOD']) { 5 $password = $_POST['password']; 6 if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) //preg_match — 执行一个正则表达式匹配 7 { 8 echo 'flag'; 9 exit; 10 } 11 while (TRUE) { 12 $reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; 13 if (6 > preg_match_all($reg, $password, $arr)){ 14 echo "hello world"; 15 break; 16 } 17 echo preg_match_all($reg, $password, $arr); 18 $c = 0; 19 $ps = array( 20 'punct', 21 'digit', 22 'upper', 23 'lower' 24 ); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母 25 foreach ($ps as $pt) { 26 if (preg_match("/[[:$pt:]]+/", $password)) $c+= 1; 27 } 28 if ($c < 3) break; 29 //>=3,必须包含四种类型三种与三种以上 30 if ("42" == $password) echo $flag; 31 else echo 'Wrong password'; 32 exit; 33 } 34 } 35 ?>
第一个问题倒是很简单,只需要长度不小于12位即可。
第二个/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/这个正则满足6次或以上。
满足其中1个+1,如果单纯的1个是不会+1的,比如1111111这样不会加1
但是1,1,1这样就会加了。
最终的payload:
POST:
password=42.000000000000e-0