Pentest 2026-05-20 Pen-28-Befunde (LOW/INFO)

28.1 URI-Schema unvollstaendig:
DANGEROUS_URI_SCHEMES erweitert um file:/ftp: – "ftp://evil.com/x.js"
und "file:///etc/passwd" wurden vorher in companyName akzeptiert.

28.2 HTML-Entity-Decoding-Bypass:
stripHtml() lief direkt ueber den Roh-String, "javascript:",
"<script>" und "<script>" umgingen die Regex.
decodeHtmlEntities() dekodiert jetzt numerische (decimal+hex) +
gaengige named entities VOR dem Tag-/URI-Strip.

28.3 Vollmacht-Upload Magic-Byte-Check:
multer pruefte nur client-MIME, HTML/PHP/Shell-Scripts kamen als
application/pdf durch. uploadAuthorizationDocument liest jetzt die
ersten 5 Bytes und verlangt "%PDF-", sonst Loeschen + 400.

28.4 Rate-Limit auf /api/public/consent:
30 Requests pro IP pro 15min. Brute-Force-sicher war der 128-bit-
UUID-Hash schon, aber ohne Limit konnte ein Angreifer das System
mit Audit-Log- und Mail-Spam belasten.

Live-verifiziert auf dev: alle vier Bypaesse blockiert, legitime
Eingaben unangetastet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 17:46:15 +02:00
parent 8e48d3b432
commit 65ec07e274
5 changed files with 121 additions and 7 deletions
+34
View File
@@ -120,6 +120,40 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
- **Live-verifiziert**: 4867 Datensätze + 1 Datei in 13.2s
wiederhergestellt, Log-Modal zeigt den vollständigen Verlauf.
- [x] **🛡️ Pentest 2026-05-20 Pen-28-Befunde (LOW/INFO)**
- **28.1 URI-Schema unvollständig**: `DANGEROUS_URI_SCHEMES`-Regex
erweitert um `file:` und `ftp:`. `ftp://evil.com/x.js` und
`file:///etc/passwd` in companyName werden jetzt zu
`blocked://...` bzw. `blocked:///...` neutralisiert.
- **28.2 HTML-Entity-Decoding-Bypass**: `stripHtml` lief vorher
direkt über den Roh-String, sodass `&#106;avascript:`,
`&#x3C;script&#x3E;` und `&lt;script&gt;` an der Regex
vorbeischlüpften. Neuer `decodeHtmlEntities()` läuft VOR dem
Strip und dekodiert numerische (`&#NN;`/`&#xHH;`) + gängige
Named-Entities (lt/gt/quot/apos/amp). Danach greift die normale
Tag- und URI-Säuberung wieder.
- **28.3 Vollmacht-Upload Magic-Byte-Check**: multer prüfte nur
den client-gemeldeten MIME-Type, eine HTML/PHP-Datei als
`application/pdf` kam durch. Neuer Check liest die ersten 5
Bytes nach dem Upload und verlangt `%PDF-` sonst wird die
Datei gelöscht und 400 geliefert. Greift bevor irgendwas in
der DB landet.
- **28.4 Rate-Limit auf /api/public/consent**: 30 Requests pro
IP pro 15 Minuten. Brute-Force-sicher war der 128-Bit-UUID-Hash
schon, aber ohne Limit konnte ein Angreifer das System per
POST-Spam mit Audit-Logs und Mail-Versand belasten. Neuer
`publicConsentRateLimiter` greift jetzt auf alle drei
Sub-Routes (`/:hash`, `/:hash/grant`, `/:hash/pdf`).
- **Live-verifiziert** auf dev:
- `ftp://evil.com/x.js``blocked://evil.com/x.js`
- `file:///etc/passwd``blocked:///etc/passwd`
- `&#106;avascript:alert(1)``blocked:alert(1)`
- `&#x3C;script&#x3E;alert(1)&#x3C;/script&#x3E;OK``OK`
- `&lt;script&gt;bad()&lt;/script&gt;Legit``Legit`
- HTML-Datei als PDF hochgeladen → 400 + Datei gelöscht
- Echtes PDF (Magic-Bytes ok) → 200
- 35× POST auf public-consent → Req 130 = 404, Req 31+ = 429
- [x] **🧹 Pentest 2026-05-20 LOW/INFO-Sammelfix**
- **27.1 Path-Traversal-Strings in DB**: `cleanupConsents` validierte
`documentPath` zuvor nur per stripHtml, was `../../../etc/passwd`