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