你真的會PHP嗎?wtiteup
阿新 • • 發佈:2019-01-06
一道程式碼審計題
題目連結:http://ctf5.shiyanbar.com/web/PHP/index.php
進入題目,顯示have a fun! 檢視原始碼,沒什麼東西。那麼bp抓包看一下
有個hint,開啟看到原始碼
foreach([$_POST] as $global_var) { foreach($global_var as $key => $value) { $value = trim($value); is_string($value) && $req[$key] = addslashes($value); } } function is_palindrome_number($number) { $number = strval($number); $i = 0; $j = strlen($number) - 1; while($i < $j) { if($number[$i] !== $number[$j]) { return false; } $i++; $j--; } return true; } if(is_numeric($_REQUEST['number'])){ $info="sorry, you cann't input a number!"; }elseif($req['number']!=strval(intval($req['number']))){ $info = "number must be equal to it's integer!! "; }else{ $value1 = intval($req["number"]); $value2 = intval(strrev($req["number"])); if($value1!=$value2){ $info="no, this is not a palindrome number!"; }else{ if(is_palindrome_number($req["number"])){ $info = "nice! {$value1} is a palindrome number!"; }else{ $info=$flag; } } }
is_numeric($_REQUEST['number']);$req['number']!=strval(intval($req['number'])函式判斷是否為數字 這兩句要求提交的數不能是數字包括小數
if(intval($req["number"])=intval(strrev($req["number"])))這句的要求為該數的反序列的整數值應該等於它本身的整數值即是一個迴文數
is_palindrome_number($req["number"])這句要求提交的數不是一個迴文數
我們可以利用intval函式的限制:那就是Intval最大的值取決於作業系統。
32位系統最大帶符號的 integer 範圍是 -2147483648 到 2147483647。舉例,在這樣的系統上, intval(‘1000000000000’) 會返回 2147483647。構造payload:url?2147483647%00繞過,在瀏覽器上沒有反應,拿bp post
is_numeric函式在開始判斷前,會先跳過所有空白字元,可是題目獲取$req[‘number’]的時候明明使用trim過濾了空白字元,這時候我們可以引入\f(也就是%0c)在數字前面,來繞過最後那個is_palindrome_number函式,而對於前面的數字判斷,因為intval和is_numeric都會忽略這個字元
所以我們可以另構造url?number=%00%0c121繞過