1. 程式人生 > 其它 >周練 1

周練 1

1. bugku 變數1

PHP 超級全域性變數


超級全域性變數在PHP 4.1.0之後被啟用, 是PHP系統中自帶的變數,在一個指令碼的全部作用域中都可用。

PHP 超級全域性變數列表:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

$GLOBALS 是一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。

PHP preg_match() 函式

preg_match 函式用於執行一個正則表示式匹配。

語法

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜尋 subject 與 pattern 給定的正則表示式的一個匹配。

引數說明:

  • $pattern: 要搜尋的模式,字串形式。

  • $subject: 輸入字串。

  • $matches: 如果提供了引數matches,它將被填充為搜尋結果。 $matches[0]將包含完整模式匹配到的文字, $matches[1] 將包含第一個捕獲子組匹配到的文字,以此類推。

  • $flags:flags 可以被設定為以下標記值:

    1. PREG_OFFSET_CAPTURE: 如果傳遞了這個標記,對於每一個出現的匹配返回時會附加字串偏移量(相對於目標字串的)。 注意:這會改變填充到matches引數的陣列,使其每個元素成為一個由 第0個元素是匹配到的字串,第1個元素是該匹配字串 在目標字串subject中的偏移量。

  • offset: 通常,搜尋從目標字串的開始位置開始。可選引數 offset 用於 指定從目標字串的某個未知開始搜尋(單位是位元組)。

返回值

返回 pattern 的匹配次數。 它的值將是 0 次(不匹配)或 1 次,因為 preg_match() 在第一次匹配後 將會停止搜尋。preg_match_all() 不同於此,它會一直搜尋subject 直到到達結尾。 如果發生錯誤preg_match()返回 FALSE。

PHP preg_replace() 函式

preg_replace 函式執行一個正則表示式的搜尋和替換。

語法

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

搜尋 subject 中匹配 pattern 的部分, 以 replacement 進行替換。

引數說明:

  • $pattern: 要搜尋的模式,可以是字串或一個字串陣列。

  • $replacement: 用於替換的字串或字串陣列。

  • $subject: 要搜尋替換的目標字串或字串陣列。

  • $limit: 可選,對於每個模式用於每個 subject 字串的最大可替換次數。 預設是-1(無限制)。

  • $count: 可選,為替換執行的次數。

返回值

如果 subject 是一個數組, preg_replace() 返回一個數組, 其他情況下返回一個字串。

如果匹配被查詢到,替換後的 subject 被返回,其他情況下 返回沒有改變的 subject。如果發生錯誤,返回 NULL。

2. PHP2

 

使用御劍掃描,發現還可以有index.phps檔案

phps檔案就是php的原始碼檔案,通常用於提供給使用者(訪問者)檢視php程式碼,因為使用者無法直接通過Web瀏覽器看到php檔案的內容,所以需要用phps檔案代替。其實,只要不用php等已經在伺服器中註冊過的MIME型別為檔案即可,但為了國際通用,所以才用了phps檔案型別。
它的MIME型別為:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。

發現

PHP curl_unescape函式

(PHP 5 >= 5.5.0)

curl_unescape — 解碼經過URL編碼的字串。


說明

string curl_unescape ( resource $ch , string $str )

解碼經過URL編碼的字串。

第一步,要使得"admin"===$_GET[id]不成立

第二步,經過$_GET[id] = urldecode($_GET[id]);,使得$_GET[id] == "admin"成立。

3. warmup

掃描,發現source 檔案

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 

PHP mb_substr() 函式

例項

從字串中返回 "菜鳥":

<?php echo mb_substr("菜鳥教程", 0, 2); // 輸出:菜鳥 ?>

定義和用法

mb_substr() 函式返回字串的一部分,之前我們學過 substr() 函式,它只針對英文字元,如果要分割的中文文字則需要使用 mb_substr()。

註釋:如果 start 引數是負數且 length 小於或等於 start,則 length 為 0。

 

我們利用三個 if 語句構造引數:
?file=source.php?/../../../../ffffllllaaaagggg
第一個?表示傳參,第二個?用來滿足擷取

 

 

 在include中路徑優先

4. eval

 

相關程式碼

 

 

 

 

 

 

在url後加?hello=file('flag.php')即可