<rp id="hfr5n"></rp>
<tt id="hfr5n"></tt>
  • <cite id="hfr5n"></cite>
  • <cite id="hfr5n"></cite>

    <rp id="hfr5n"></rp>

    91Ri.org_我的安全攻防指南

    打開微信“掃一掃”,打開網頁后點擊屏幕右上角分享按鈕

    PHP 運行時漏洞檢測

    0x00 前言

    這片博文將簡單的介紹我編寫的 PHP 運行時漏洞檢測系統?prvd?的檢測邏輯, 以及該系統在實際測試中的效果。

    0x01 基本知識

    在這里我們先介紹幾個常用的詞語:

    1. source數據來源點,可以是:
      • 網絡,例如常規的 Web 參數等
      • 文件系統
      • 數據庫
      • 等等其他用戶可控或者間接可控的地方
    2. filter數據過濾處理點,可以是:
      • 編碼解碼,例如?base64_decode?等
      • 常規字符串操作,例如?strtolower?等
      • 安全過濾,例如?mysqli_escape_string?等
      • 等等其他會更改字符串內容的地方
    3. sink漏洞觸發點,可以是:
      • 操作文件相關行為,例如?file_put_content?等
      • 操作網絡相關函數,例如?curl?等
      • 操作命令相關行為,例如?system?等
      • 等等其他危險行為

    有些地方既可以是 source 點,也可以是 sink 點,比如說?file_put_content?在參數可控的時候是 sink 點,因為返回的數據也是我們可控的,這里返回的數據也是 source 點。

    0x02 xmark

    我們先簡單地介紹一下?xmark,這是一個 PHP7 擴展,能夠直接使用 PHP 代碼做到:

    • 對字符串變量進行打標記
    • Hook 絕大多數函數/類
    • Hook 部分 opcode

    基于?xmark?所提供的功能,即便是我們不熟悉 PHP 內部實現,我們也能夠很簡單的去實現:

    • PHP RASP
    • PHP 解密工具,例如?phpdecoder
    • PHP 運行時漏洞檢測

    因為 PHP 并不像 Python、Ruby 等其他語言可以很方便的 Hook 函數、類,所以我們開發了這么一個擴展來完成類似的功能。

    實際上?xmark?這個項目有不少代碼是直接拷貝?taint?的, 那為什么要改這樣一個輪子呢?

    • taint 的 source 點覆蓋不全面,只對 GPC 進行標記
    • taint 處理和漏洞相關的邏輯需要在 PHP 擴展中實現

    這里我不打算花太多篇幅介紹 xmark 的實現,直接看代碼更方便,更多關于 xmark 的信息可以點這里

    0x03 prvd

    前面說了基于?xmark?我們可以實現挺多好玩的事情, 這里我選擇去完成一個 PHP 運行時漏洞檢測系統,也就是?prvd?這個項目, 項目名也就是 PHP Runtime Vulnerability Detection 的縮寫。

    prvd 有兩種模式,一種是 taint 模式, 另外一種是 payload 模式。taint 模式可以選擇開啟,payload 模式是一直都開啟的。 這兩種模式都依賴外部來解決執行路徑的問題。

    taint 模式

    這種模式下 prvd 和 taint 一樣,都是 source 打上一個標記,在某些 filter 中傳遞這個標記,然后在 sink 點檢查對應的參數是否被打上標記。

    比方說:

    $_POST['cmd']?一開始就被我們打上了標記,在自賦值的時候將標記傳遞給了?$cmd1, 在經歷?strtolower?這個 filter 的時候繼續將標記傳遞給了?$cmd2,?$cmd2?最后進入 sink 點?system?函數的時候被檢測被打上了標記,從而確定是否可能存在問題。

    taint 模式可以不需要輸入特定的 payload 進行攻擊就可能發現一些漏洞點,也不會污染數據,但是在 filter 中判斷是否應該繼續傳遞標記比較難處理, 有可能數據已經經過了很好的過濾,但是我們還是繼續傳遞了標記,最終導致誤報。也有可能數據處理不當,但我們已經去除了標記,最終導致漏報。

    我們舉個漏報的例子:

    可控變量?$id?經過?mysqli_real_escape_string?的時候需不需清除其標記呢?

    為了解決這種情況,我編寫了另外一種 payload 模式。

    payload 模式

    有時候追蹤執行流并沒有什么用,整那么多玩意,還不如直接一把梭哈,直接把 payload 打過去,然后在 sink 點觀測, 這就是我們的 payload 模式,這個模式的 prvd 可以歸類為 IAST 的一種。

    payload 模式相比 taint 模式,優點為:

    • 誤報率比 taint 模式低,使用 payload 模式,從技術上完全把誤報率降低到 1% 以下
    • 可以不關注 source 點和 filter 點,這樣即使數據經歷多次中轉,最后經過 sink 點的漏洞,也有能力去檢測,比如說多階 SQL 注入的情況

    缺點為:

    • 漏報率可能會比 taint 模式下高,因為可能經過各種 filter 的時候就被 payload 就會攔截下來,也可能需要特定 payload 才能觸發漏洞
    • 需要特別關注 sink 點,在 sink 點中根據各種條件判斷是否為漏洞
    • 會污染數據

    下面簡單的介紹一下在 payload 模式下,各種漏洞的檢測方法:

    我知道上面的各種檢測方式并不完美,每個漏洞的檢測方法都有誤報和漏報的情況,不過現階段還是夠用的,可以以后繼續完善。

    fuzzer

    這里我使用 Python 寫了一個比較簡單的 fuzzer 放在項目 tools 目錄下,目前也只是對每個 source 點增加一個?'"><xtanzi>./../xtanzi?這樣的 payload

    這個 fuzzer 的 DSN 地址為?http://admin:password@ip:9090/fuzz

    這里也可以根據自己的情況,重新編寫 fuzzer。

    Sentry 漏洞展示

    至此,我們還缺少一個漏洞上報的平臺,我們希望這個平臺能夠:

    • 良好的權限管理,擁有的 group、project 等功能
    • 收集到漏洞觸發時的請求信息
    • 收集到漏洞觸發時的堆棧信息
    • 能夠對多個同堆棧下的重復漏洞進行去重
    • 能夠一鍵提交 jira 以及 git issue
    • 各種統計功能

    天啊,需求越來越多,我們的精力更多的被分配到了這個平臺上了,請不要忘了我們本意是要做一個 PHP 運行時漏洞檢測系統。 上報平臺雖然重要,但不應該成為整套系統花費精力最多的部分,我們需要把時間放在漏洞檢測這塊。

    這個時候我想起了?Sentry

    Sentry is cross-platform application monitoring, with a focus on error reporting.

    Sentry 本來是一個跨平臺應用的異常報告系統,但在我們這套 PHP 運行時漏洞檢測系統中被使用為漏洞上報平臺了,理由是:

    • 支持上面提到的需求
    • 界面美觀
    • DRY

    我們的 prvd 可以說是 Sentry 的一個檢測漏洞的 Client,只不過 prvd 的功能不是報告異常,而是報告漏洞, 由于 Sentry 支持多種語言,所以我們不僅可以給 PHP 寫這樣一個 Client,還可以給 Python, Ruby 等其他語言寫這樣檢測漏洞的 Client

    0x04 實際例子

    最后,我們拿?DedeCMS?作為測試例子,看看 prvd 的效果如何。

    安裝環境

    首先在?dede/config.php?修改?csrf_check?函數讓其直接返回 true,其次執行下面命令啟動 fuzzer:

    然后前往?Sentry?注冊一個賬號,或者自建一套 Sentry 服務

    剩下的可以直接使用 docker

    因為 taint 模式誤報會比較多(taint 模式出來的漏洞在 Sentry 上會以藍色標注),我也并不打算花時間去 review 詳情,所以這里我只啟用了 payload 模式。

    檢測過程

    每個功能點都亂點一下,每個輸入框都隨便寫寫,盡量每個功能都能夠瞎點瞎填覆蓋到。

    DedeCMS 相關漏洞

    最后得出下面這些可疑的漏洞:

    雖然都只是后臺的漏洞,但拿來做演示是最好不過了 :)

    0x05 總結

    上面簡單的介紹了 prvd 的檢測原理和使用過程。簡單的說,prvd 就是一個半自動的 PHP 運行時漏洞檢測系統, 在 taint 模式下,會盡可能顯示可疑漏洞,方便熟悉安全的人員或者開發人員去 review 代碼, 在 payload 模式下,即使不太了解安全的測試人員也能夠檢測出漏洞。

    0x06 引用

    原文連接:http://blog.fatezero.org/2018/11/11/prvd/?tdsourcetag=s_pctim_aiomsg

    評論已關閉。

    日本丰满熟妇有毛