語法:
int preg_match_all (字符串$ pattern ,字符串$ subject [,數組和$ matches [,整數$ flags = PREG_PATTERN_ORDER [,整數$ offset = 0 ]]] )
搜索主題中所有匹配模式給定正則表達式的匹配結果並將它們以標志指定順序輸出到匹配中。
在第一個匹配找到后,子序列繼續從最后一次匹配位置搜索。
參數說明:
$ pattern:要搜索的模式,串聯形式。
$ subject:輸入字符串。
$ matches:多維數據集,作為輸出參數輸出所有匹配結果,並通過標記進行排序。
$ flags:可以結合下面的標記使用(注意不能同時使用PREG_PATTERN_ORDER和PREG_SET_ORDER):
PREG_PATTERN_ORDER:結果排序為$ matches [0]保存完整模式的所有匹配,$ matches [1]保存第一個子組的所有匹配,以此類推。
PREG_SET_ORDER:結果排序為$ matches [0]包含第一次匹配得到的所有匹配(包含子組),$ matches [1]是包含第二次匹配到的所有匹配(包含子組)的層疊,從而類推。
PREG_OFFSET_CAPTURE:如果這個標記被傳遞,每個發現的匹配返回時會增加它相對目標字符串的位移量。
offset:通常,發現時從目標字符串的開始位置開始。可選參數offset用於從目標字符串中指定位置開始搜索(單位是字節)。
返回值:返回完整的匹配次數(可能是0),或者如果發生錯誤返回FALSE。
<?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, $password, $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,所以說這是一個黑盒測試嗎?!一開始給的代碼其實是一個幌子???!!!