语法:
int preg_match_all (字符串$ pattern ,字符串$ subject [,数组和$ matches [,整数$ flags = PREG_PATTERN_ORDER [,整数$ offset = 0 ]]] )
搜索主题中所有匹配模式给定正则表达式的匹配结果并将它们以标志指定顺序输出到匹配中。
参数说明:
<?PHP
error_reporting(0);
$flag = ‘flag{test}‘;
$password= "4200000000.000000000000E-8";
/*
[:graph:]:是除空格符(空格键与[TAB]键)之外的所有按键
^ :匹配你要用来查找的字符串的开头
$:匹配结尾
{12,} :匹配重复12次或多次-->长度大于12
*/
var_dump(preg_match(‘/^[[:graph:]]{12,}$/‘,$password));
if (0 >= preg_match(‘/^[[:graph:]]{12,$password)) //preg_match — 执行一个正则表达式匹配
{
echo ‘flag‘;
exit;
}
/*
[[:punct:]] 任何标点符号
[[:digit:]] 任何数字
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
$reg --> 可打印字符
*/
while(1)
{
$reg = ‘/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/‘;
echo "preg_match_all : ";
var_dump(preg_match_all($reg,$password,$arr));
//匹配次数要大于6
if (6 > preg_match_all($reg,$arr))
{
echo "no flag";
break;
}
else
{
echo "2\n";
}
$c = 0;
$ps = array(‘punct‘,‘digit‘,‘upper‘,‘lower‘); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/",$password))
$c += 1;
}
echo "\$c :";
var_dump($c);
if ($c < 3)
{
echo "我死了";
break;
}
else
{
echo "快了\n";
}
//>=3,必须包含四种类型三种与三种以上
echo "last one :";
var_dump( "42" == $password);
if ("42" == $password)
{
echo $flag;
}
else
{
echo ‘Wrong password‘;
}
exit;
}
正常的做法:用科学计数法绕过
这题唯一的坑点就是post的时候不要用password!!!!!
清奇的做法:用hackbar随便发一个post或者发一个空的post,原理尚且未知Orz
burp版本:
经过一堆测试,发现post的只要不是“password"的就行,让后台得到的是一个空,就可以出flag,所以说这是一个黑盒测试吗?!一开始给的代码其实是一个幌子???!!!