周練 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 可以被設定為以下標記值:
-
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() 函式
例項
從字串中返回 "菜鳥":
定義和用法
mb_substr() 函式返回字串的一部分,之前我們學過 substr() 函式,它只針對英文字元,如果要分割的中文文字則需要使用 mb_substr()。
註釋:如果 start 引數是負數且 length 小於或等於 start,則 length 為 0。
我們利用三個 if 語句構造引數:
?file=source.php?/../../../../ffffllllaaaagggg
第一個?
表示傳參,第二個?
用來滿足擷取
在include中路徑優先
4. eval
相關程式碼
在url後加?hello=file('flag.php')即可