利用惡意頁面攻擊本地 Xdebug

TL;DRphp

PHP開發者以及一些安全研究人員常常會在本地搭建一個基於Xdebug的PHP的調試服務,在大部分配置狀況下,Xdebug採用HTTP請求頭中的X-Forwarded-For字段做爲DBGp協議的回連地址。受害者瀏覽攻擊頁面一段時間,攻擊者可利用DNS Rebind技術向本地服務器發送帶有惡意X-Forwarded-For的請求,即有可能在受害者電腦上執行任意代碼。html

Xdebug是用於調試PHP的擴展,能夠根據本地源碼遠程調試服務器上的PHP代碼。不少開發者和安全研究人員一般會在本地搭建一套PHP的調試環境,用於平常的開發和調試。若是服務器開啓了Xdebug的回連,而且攻擊者能直接訪問到服務器的話,能夠直接形成RCE。node

可是大部分狀況下,這些服務器處於內網環境中,有些甚至監聽在127.0.0.1上,攻擊者很難直接訪問到,致使沒法利用。若是把開發人員當作代理,利用CSRF來攻擊位於內網的Xdebug呢?visual-studio-code

咱們首先看一下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.phpconfig.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。dom

因爲DNS的解析結果也存在必定的緩存時間,在瀏覽器裏大概須要1分鐘的時間纔會失效進行第二次解析。在發生第二次解析的時候,其指向的IP地址會變爲127.0.0.1,即向受害者本地的服務器發送能觸發Xdebug反彈的請求,這時候攻擊者的服務器就能收到來自受害者Xdebug的鏈接了。攻擊者能夠經過DBGp協議中的eval命令在客戶端執行任意php代碼。ide

咱們認爲漏洞的成因是Xdebug從X-Forwarded-For頭中取IP做爲回連地址,而X-Forwarded-For頭是不可信的。

玄武實驗室於2018年3月26日將此問題報告給PHP官方,PHP官方人員於2018年3月30日做出迴應,不認爲這是一個安全問題,並將報告轉爲bug使之處於公開狀態。玄武實驗室建議PHP開發人員和安全研究人員在Xdebug的配置文件中根據當前狀況增長xdebug.remote_host配置項,來防止本身遭受此攻擊。

Author:salt@xuanwulab

參考文獻

相關文章
相關標籤/搜索