0x01 題目
<?php
show_source(__FILE__);
$flag = "xxxx";
if(isset($_GET['time'])){
if(!is_numeric($_GET['time'])){
echo 'The time must be number.';
}else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){
echo 'This time is too short.';
}else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){
echo 'This time is too long.';
}else{
sleep((int)$_GET['time']);
echo $flag;
}
echo '<hr>';
}
?>
0x02 解題
首先分析代碼撩笆,這里GET得到time參數(shù),進(jìn)行is_numeric()判斷缸浦,如果是數(shù)字夕冲,則進(jìn)行大小判斷,要求time參數(shù)在5184000(包括)~7776000(包括)之間裂逐,如果成立歹鱼,則等待time秒,最后得到flag卜高。
首先弥姻,這題肯定不是老老實(shí)實(shí)的輸入符合條件的time數(shù)值南片,因?yàn)榫退爿攲?duì)了這個(gè)等待時(shí)間也忒長(zhǎng)了。庭敦。疼进。那么注意到這里有個(gè)比較關(guān)鍵的函數(shù)是is_numeric()和后面的int強(qiáng)制類型轉(zhuǎn)換了。
is_numeric()函數(shù)查閱php手冊(cè)知道它接受一個(gè)數(shù)字或者數(shù)字型字符串秧廉,而從GET獲取的參數(shù)是字符串伞广,那么后面的強(qiáng)制類型轉(zhuǎn)換就是字符串轉(zhuǎn)換為int類型的數(shù)字。
查閱資料得到:is_numeric()支持普通數(shù)字型字符串疼电、科學(xué)記數(shù)法型字符串嚼锄、部分支持十六進(jìn)制0x型字符串。而強(qiáng)制類型轉(zhuǎn)換int澜沟,不能正確轉(zhuǎn)換的類型有十六進(jìn)制型字符串灾票、科學(xué)計(jì)數(shù)法型字符串(部分)。
因此可以輸入十六進(jìn)制和科學(xué)計(jì)數(shù)法來進(jìn)行繞過茫虽。本地測(cè)試一下:
<?php
show_source(__FILE__);
if(is_numeric($_GET['time'])){
$hhh = (int)$_GET['time'];
echo $hhh;
}else{
echo "input a number";
}
?>
經(jīng)測(cè)試發(fā)現(xiàn)當(dāng)我們輸入十六進(jìn)制和0e開頭的科學(xué)計(jì)數(shù)法的時(shí)候都輸出了0刊苍,所以應(yīng)該是當(dāng)字符串轉(zhuǎn)換到int類型的時(shí)候,會(huì)從第一個(gè)非數(shù)字的地方進(jìn)行截取濒析,只用數(shù)字部分正什,所以答案就是
?time=0x4f1a00