來自先知社區-紅日安全-代碼審計小組的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(跨站腳本攻擊)漏洞。雖然題目代碼分別用了 escape 和 filter_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攻擊
實例
題目叫做雪花,代碼如下:
漏洞分析
存在兩個安全漏洞
-
文件包含,第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