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.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。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