PHP代碼審計Day學習筆記1-4

來自先知社區-紅日安全-代碼審計小組的PHP代碼審計的項目本階段的內容題目均來自 PHP SECURITY CALENDAR 2017

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

htmlspecialchars — 將特殊字符轉換爲 HTML 實體

實例

題目叫做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

class_exists — 檢查類是否已定義

SimpleXMLElement

用來表示XML文檔中的元素,爲PHP的內置類。

XXE攻擊

XXE(XML External Entity attack)漏洞

實例

題目叫做雪花,代碼如下:

漏洞分析

存在兩個安全漏洞

  • 文件包含,第8行使用class_exists() 函數來判斷用戶傳過來的控制器是否存在,默認情況下,如果程序存在 __autoload 函數,那麼在使用 class_exists() 函數就會自動調用本程序中的 __autoload 函數,攻擊者可以使用

  • 路徑穿越來包含任意文件,當然使用路徑穿越符號的前提是 PHP5~5.3(包含5.3版本)版本 之間纔可以。例如類名爲: …/…/…/…/etc/passwd 的查找,將查看passwd文件內容

  • 第9行,實例化類的類名和傳入類的參數均在用戶的控制之下可以使用PHP的內置類 SimpleXMLElement來進行 XXE攻擊,進而讀取目標文件的內容,甚至命令執行(前提是安裝了PHP拓展插件expect)

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

詳見

Day4 strpos使用不當引發漏洞

定義

strpos

查找字符串首次出現的位置

實例

題目名字叫假鬍子,代碼如下:

漏洞分析

  • 第8行strpos的使用不當,當strpos函數判斷時首字符符合時會返回0,與false取反都爲true

詳見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章