天天看點

【PHP代碼審計】extract變量覆寫extract函數介紹extract函數使用extract變量覆寫案例題

文章目錄

  • extract函數介紹
  • extract函數使用
  • extract變量覆寫案例題

extract函數介紹

首先看一下函數文法:

extract(array,extract_rules,prefix)

參數 描述
array 必需。規定要使用的數組。
extract_rules

可選。extract() 函數将檢查每個鍵名是否為合法的變量名,同時也檢查和符号表中已存在的變量名是否沖突。對不合法和沖突的鍵名的處理将根據此參數決定。

可能的值:

EXTR_OVERWRITE - 預設。如果有沖突,則覆寫已有的變量。

EXTR_SKIP - 如果有沖突,不覆寫已有的變量。

EXTR_PREFIX_SAME - 如果有沖突,在變量名前加上字首 prefix。

EXTR_PREFIX_ALL - 給所有變量名加上字首 prefix。

EXTR_PREFIX_INVALID - 僅在不合法或數字變量名前加上字首 prefix。

EXTR_IF_EXISTS - 僅在目前符号表中已有同名變量時,覆寫它們的值。其它的都不處理。

EXTR_PREFIX_IF_EXISTS - 僅在目前符号表中已有同名變量時,建立附加了字首的變量名,其它的都不處理。

EXTR_REFS - 将變量作為引用提取。導入的變量仍然引用了數組參數的值。

prefix

可選。請注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時需要。如果附加了字首後的結果不是合法的變量名,将不會導入到符号表中。

字首和數組鍵名之間會自動加上一個下劃線。

extract函數使用

看w3school給出的執行個體代碼如下:

<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, "dup");
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>
           

傳回結果為:

$a = Original; $b = Dog; $c = Horse; $dup_a = Cat
           

檢視上述函數介紹可以了解,此執行個體extract函數作用将鍵和值注冊成變量和值,且EXTR_PREFIX_SAME設定是如果變量沖突,就加上後面的字首也就是dup,是以變量a不變,産生新的變量dup_a被指派為cat

extract變量覆寫案例題

題目代碼如下:

<?php

$flag='xxx'; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo'ctf{xxx}'; 
    }
   else
   { 
    echo'Oh.no';
   } 
   }
   
?>
           

結合上述知識點可以了解,extract不帶參數會預設覆寫變量,最後是shiyan和content值相等輸出flag,構造請求如下

http://192.168.81.120/01.php?flag=&shiyan=

可以看到輸出flag

【PHP代碼審計】extract變量覆寫extract函數介紹extract函數使用extract變量覆寫案例題