1. 程式人生 > 實用技巧 >ctfshow之Web入門 PHP特性 89-95

ctfshow之Web入門 PHP特性 89-95

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=010574 八進位制
//這裡不能是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

參考:

原文

PHP intval() 函式