1. 程式人生 > >PHP程式碼審計Day學習筆記

PHP程式碼審計Day學習筆記

Day1 in_array函式缺陷

定義

in_array函式

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

引數 描述
needle 必需,規定要在陣列搜尋的值
haystack 必需。規定要搜尋的陣列
strict 可選。如果該引數設定為 TRUE,則 in_array() 函式檢查搜尋的資料與陣列的值的型別是否相同

例項

題目叫做願望清單,程式碼如下:

漏洞解析

存在任意檔案上傳漏洞,

  • 12行使用**in_array()**函式檢測檔名。

但由於第三個引數為預設,不會檢查搜尋的資料與陣列的值型別是否相同.若檔名為7shell.php

則會解析為7,7在**range(1,24)**中,所以可繞過.造成任意檔案上傳漏洞。

詳見

Day2 filter_var

定義

filter_var()

filter_var(variable, filter, options) 函式通過指定的過濾器過濾一個變數。 如果成功,則返回被過濾的資料。如果失敗,則返回 FALSE。

引數 描述
variable 必需。規定要過濾的變數。
filter 可選。規定要使用的過濾器的 ID。預設是 FILTER_SANITIZE_STRING。參見 完整的 PHP Filter 參考手冊,檢視可能的過濾器。過濾器 ID 可以是 ID 名稱(比如 FILTER_VALIDATE_EMAIL)或 ID 號(比如 274)。
option 可選。規定一個包含標誌/選項的關聯陣列或者一個單一的標誌/選項。檢查每個過濾器可能的標誌和選項。

FILTER_VALIDATE_URL

FILTER_VALIDATE_URL 過濾器把值作為 URL 來驗證。

escape

PHP的一個模板引擎 Twig 中的escape過濾方法,是用PHP內建函式 htmlspecialchars 來實現的

htmlspecialchars

例項

題目叫做Twig,程式碼如下:

漏洞解析

這一關題目實際上用的是PHP的一個模板引擎 Twig ,本題考察XSS(跨站指令碼攻擊)漏洞。雖然題目程式碼分別用了 escapefilter_var

兩個過濾方法,但是還是可以被攻擊者繞過。

  • 第8行程式使用 Twig 模板引擎定義的 escape 過濾器來過濾link
  • 第17行 ,這裡用了 filter_var 函式來過濾 nextSlide 變數,且用了 FILTER_VALIDATE_URL 過濾器來判斷是否是一個合法的url

這兩處過濾,用JavaScript偽協議繞過 pyload:

?url=javascript://comment%250aalert(1)
  • 實際上,這裡的 // 在JavaScript中表示單行註釋,所以後面的內容均為註釋,那為什麼會執行 alert 函式呢?那是因為我們這裡用了字元 %0a ,該字元為換行符,所以 alert 語句與註釋符 // 就不在同一行,就能執行
  • 這裡我們要對 % 百分號編碼成 %25 ,因為程式將瀏覽器發來的payload:javascript://comment%250aalert(1) 先解碼成: javascript://comment%0aalert(1)
  • 儲存在變數 $url 中(上圖第二行程式碼),然後使用者點選a標籤連結就會觸發 alert 函式。

詳見

Day3 例項化任意物件漏洞

定義

__autoload

__autoload — 嘗試載入未定義的類(7.2起已廢棄)

class_exists

SimpleXMLElement

用來表示XML文件中的元素,為PHP的內建類。

XXE攻擊

例項

題目叫做雪花,程式碼如下:

漏洞分析

存在兩個安全漏洞

  • 檔案包含,第8行使用class_exists() 函式來判斷使用者傳過來的控制器是否存在,預設情況下,如果程式存在 __autoload 函式,那麼在使用 class_exists() 函式就會自動呼叫本程式中的 __autoload 函式,攻擊者可以使用

  • 路徑穿越來包含任意檔案,當然使用路徑穿越符號的前提是 PHP5~5.3(包含5.3版本)版本 之間才可以。例如類名為: …/…/…/…/etc/passwd 的查詢,將檢視passwd檔案內容

  • 第9行,例項化類的類名和傳入類的引數均在使用者的控制之下可以使用PHP的內建類 SimpleXMLElement來進行 XXE攻擊,進而讀取目標檔案的內容,甚至命令執行(前提是安裝了PHP拓展外掛expect)

關於 SimpleXMLElement 導致的XXE攻擊,下面再給出一個demo案例

詳見