bugku数字验证绕过正则

题目: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

原文地址:https://www.cnblogs.com/nul1/p/9343091.html