作者:salt@騰訊玄武實驗室
原文:https://xlab.tencent.com/cn/2018/03/30/pwn-local-xdebug/
TL;DR
PHP開發者以及一些安全研究人員經常會在本地搭建一個基於Xdebug的PHP的調試服務,在大部分配置情況下,Xdebug採用HTTP請求頭中的X-Forwarded-For字段作為DBGp協議的回連地址。受害者瀏覽攻擊頁面一段時間,攻擊者可利用DNS Rebind技術向本地服務器發送帶有惡意X-Forwarded-For的請求,即有可能在受害者電腦上執行任意代碼。
Xdebug是用於調試PHP的擴展,可以根據本地源碼遠程調試服務器上的PHP代碼。很多開發者和安全研究人員通常會在本地搭建一套PHP的調試環境,用於日常的開發和調試。如果服務器開啟了Xdebug的回連,並且攻擊者能直接訪問到服務器的話,可以直接造成RCE。
但是大部分情況下,這些服務器處於內網環境中,有些甚至監聽在127.0.0.1上,攻擊者很難直接訪問到,導致無法利用。如果把開發人員當做代理,利用CSRF來攻擊位於內網的Xdebug呢?
我們首先看一下Xdebug有關遠程調試的文檔。
如果xdebug.remote_connect_back啟用,xdebug.remote_host沒有設置,Xdebug會主動連接發起HTTP請求的客戶端。Xdebug會依次檢測$_SERVER['HTTP_X_FORWARDED_FOR']
、$_SERVER['REMOTE_ADDR']
來決定回連的IP地址。
即當Xdebug有類似如下的配置的時候,即有機會讓Xdebug回連到請求頭中X-Forwarded-For指向的ip地址。
xdebug.remote_connect_back = 1 xdebug.remote_enable = 1 xdebug.remote_log = /tmp/test.log
一般來講,在PHP開發人員的本地環境中會有index.php和config.php等文件。在受害者訪問攻擊者的惡意頁面時,攻擊者可以讓受害者在瀏覽器里嘗試向本地url如http://127.0.0.1/index.php?XDEBUG_SESSION_START
或者http://127.0.0.1/config.php?XDEBUG_SESSION_START
發起HTTP請求,並帶有指向攻擊者服務器的X-Forwarded-For請求頭。這樣攻擊者就能在自己的服務器上收到來自受害者的DBGp協議的連接,在受害者的電腦上執行任意PHP代碼。
我們都知道,在瀏覽器里發送帶有非simple header的CORS請求的時候,需要先發送一個preflight request探測服務器是否允許發送這種請求頭。此檢測過程是由一個OPTIONS請求完成的。如果OPTIONS請求的響應頭裡有Access-Control-Allow-Headers: X-Forwarded-For這一項的話,才能發送帶有X-Forwarded-For的GET或者POST請求。在受害者的本地環境中,幾乎不會有這種響應頭的。
不過,攻擊者可以採用DNS Rebind的方式來繞過這個限制。攻擊者首先自己搭建一個DNS解析服務器,讓自己控制的域名在發生第一次DNS解析的時候指向攻擊者的服務器,以後都解析到127.0.0.1。這樣當受害者訪問攻擊者的頁面(http://attacker-domain-with-dns-rebind/exp.html
)的時候,會從攻擊者的服務器上拉取攻擊代碼,使瀏覽器循環向http://attacker-domain-with-dns-rebind/index.php?XDEBUG_SESSION_START
發送帶有惡意X-Forwarded-For
頭的請求。因為攻擊者存放攻擊代碼的頁面和觸發Xdebug回連請求的url在同一個域內,即可不用發送前面所說的 preflight request。
由於DNS的解析結果也存在一定的緩存時間,在瀏覽器里大概需要1分鐘的時間才會失效進行第二次解析。在發生第二次解析的時候,其指向的IP地址會變為127.0.0.1,即向受害者本地的服務器發送能觸發Xdebug反彈的請求,這時候攻擊者的服務器就能收到來自受害者Xdebug的連接了。攻擊者可以通過DBGp協議中的eval命令在客戶端執行任意php代碼。
我們認為漏洞的成因是Xdebug從X-Forwarded-For
頭中取IP作為回連地址,而X-Forwarded-For
頭是不可信的。
玄武實驗室於2018年3月26日將此問題報告給PHP官方,PHP官方人員於2018年3月30日作出回應,不認為這是一個安全問題,並將報告轉為bug使之處於公開狀態。玄武實驗室建議PHP開發人員和安全研究人員在Xdebug的配置文件中根據當前情況增加xdebug.remote_host
配置項,來防止自己遭受此攻擊。
視頻:https://player.youku.com/embed/XMzUwMjMzNzAyOA==
參考文獻
- https://bugs.php.net/bug.php?id=76149
- https://ricterz.me/posts/Xdebug%3A%20A%20Tiny%20Attack%20Surface
- https://medium.com/0xcc/visual-studio-code-silently-fixed-a-remote-code-execution-vulnerability-8189e85b486b
- http://bluec0re.blogspot.ch/2018/03/cve-2018-7160-pwning-nodejs-developers.html
转载请注明:IAMCOOL » 利用惡意頁面攻擊本地Xdebug