PHP代碼審計基礎-中級篇


初級篇更多是對那些已有的版本漏洞分析,存在安全問題的函數進行講解,中級篇更多是針對用戶輸入對漏洞進行利用

 

中級篇更多是考慮由用戶輸入導致的安全問題。

預備工具首先要有php本地環境可以調試代碼

 

總結就是

1. 可以控制的變量【一切輸入都是有害的 】

2. 變量到達有利用價值的函數[危險函數] 【一切進入函數的變量是有害的】

程序的本質是變量與函數,我們審計的漏洞也無法擺脫這兩個元素,讓我們先來看下漏洞形成的條件

 

漏洞的利用效果最終也取決與函數的功能。所以我們在下面講述

漏洞挖掘的過程中,也將圍繞着這兩個元素來展開。

我們提到漏洞形成的兩大元素是可控變量,和可控變量能夠進入

的函數。那么在漏洞挖掘中,我們也不外乎從這兩個方向來開始。

收集可控變量

當代碼量巨大的時候我們就需要審計工具來幫我們完成一些敏感函數和變量的追蹤

例如常用的審計工具

Seay源代碼審計系統,一款開源的審計程序。主要針對php代碼審計基於危險函數正則匹配

Rirs,基於語義檢測,誤報率低。

Fortify SCA 商用軟件需要破解支持多種語言

百度都有可以自行下載

 

SQL注入

對於SQL注入建議正向追蹤。在拿到源碼時先找到它的過濾注入函數判斷

1.如果沒有過濾就可以直接注入

2.如過調用了addslashes   就無法對字符型做繞過,當然如果他設置了

Set character_set_client=gbk 開啟了gbk連接就會存在寬字節注入 

  1. . 數字型注入如果無強轉可以繞過的
  2. . 如果高版本php用了pdo 綁定參數 也不會存在注入
  3. . urldecode 二次注入 如果調用了這個方法就會存在url二次編碼注入
  4.   Mysql_real_escape_string() 對00字節,,\n,\r,\,’,”,\x1a 進行轉義

如果參數調用此函數過濾則不存在注入

 

XSS注入

查找過濾函數如 htmlspecialchars 對接收到參數做html編碼為<>等。 如果不對標簽做過濾,也可以利用內置標簽的屬性來注入xss,xss各種標簽和新特性導致了很難防御所以也更容易找到。

反射型和存儲型xss只需要跟蹤輸入輸出位置是否有過濾,而dom型你還要對js做審計查看是否直接輸出的js代碼。

 

CSRF

Csrf需要找到修改密碼,刪除信息,修改信息等重要操作的地方查看,有沒有加referer或者token驗證 否者就存在csrf漏洞 。或者直接看公共的核心文件是否有加token驗證之類的代碼。

 

文件包含

包含可以直接執行包含文件的代碼,包含的文件格式不是受限。分為本地包含和遠程包含。

本地包含:需要注意includ(),include_once(),require(),require_once()

包含php上傳的臨時文件,在url請求php代碼記錄到webserver日志在包含

Webserver的日志 如果是linux 可以包含/proc/self/environ

遠程文件包含

需要查看php.ini配置 allow_url_include=on 可以直接用php偽協議進行包含代碼

然而大部分情況都是本地文件包含, 對文件包含截斷我們通常可以%00就行截斷,同樣的也可以利用多個句號(.)和反斜杠(/)進行截斷

在windows 下測試240個連接點(.)可以截斷,linux下需要2038個(/)組合才能截斷,但是在php5.3版本以后就不能利用了。

現在還能用的無版本限制的也只有遠程文件包含利用(?),(空格),(#) 進行后綴利用截斷。

 

文件下載和讀取

可以根據功能點快速定位到代碼 查看fiel_get_contents(),等一些讀取文件函數是否有權限驗證沒有的話就存在任意文件讀取

 

文件上傳漏洞

找到上傳文件代碼或者全局搜索move_uploaded_file() 查看是否有進行條件過濾。

基於黑名單繞過:大小寫,雙寫過濾,特殊擴展名,非法符號

基於白名單繞過:%00截斷,非法符號截斷,中文字符截斷

文件頭驗證繞過:直接篡改頭類型

文件CG渲染繞過:正常圖片加流文件合並繞過

 

文件刪除漏洞

多見個人中心文件管理位置刪除功能可以越權刪除,代碼未做目錄跳轉限制

和權限驗證可以造成任意文件刪除

 

代碼執行漏洞

常見eval(),assert(),preg_replace(),call_user_func(),call_user_funca_array(),array_map()等可造成命令執行 還有動態函數 $a($b)

Call_user_funca(),call_user_funca_array() 動態調用。這些都可以通過工具進行追蹤可以看是否參數可控。

 

命令執行

只要對接受參數未作過濾直接帶入7個函數進行命令執行

System(),exec(),shell_exec(),passthru(),pcntl_exec(),proc_optn()函數

反引號也可以例如`cmd` 將被執行命令 可以直接利用工具追蹤查看參數是否可控

 

越權

分兩種水平越權,垂直越權。

大多存在在uid身份標識位置的可篡改造成越權。對不同的用戶身份篡改造成不同的越權。還有的頁面沒有設置權限訪問,可以未授權訪問。

 

本篇雖然篇幅過少但實操確實非常重要的,可以去找開源cms去練手做到熟能生巧,以具備快速審計能力。

謹記必須要大量的審計代碼訓練才能對以上漏洞做到非常熟練。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM