Pentest 2026-05-20 MEDIUM+LOW Follow-ups
MEDIUM – Consent-Mass-Assignment:
PUT /api/gdpr/customer/:id/consents/:type nahm source/documentPath/
version ungefiltert aus dem Body. Portal-User konnte
source="ADMIN_OVERRIDE", version="<script>" oder
documentPath="../../etc/passwd" durchschmuggeln.
Fix: nur status aus Body, source server-seitig auf "portal"
hardcoded, documentPath/version bleiben NULL (werden dediziert
vom Authorization-Upload server-seitig gesetzt). Whitelist
ALLOWED_CONSENT_SOURCES für source-Werte. grantAuthorization
(Admin) erzwingt die Whitelist ebenfalls; notes läuft jetzt
durch stripHtml.
LOW – javascript:-URI in companyName:
stripHtml() entfernte HTML-Tags, ließ aber javascript:/data:/
vbscript:-Schemata stehen. companyName="javascript:alert(1)"
hätte in <a href={companyName}> aktiv werden können.
Fix: stripHtml ersetzt jene Schemata mit "blocked:" – legitimer
Text bleibt unangetastet, das Schema wird unschädlich.
LOW – documentPath ohne Validierung:
Bereits durch obigen Consent-Fix erledigt; Cleanup-Pass strippt
zusätzlich vorhandene dreckige Pfade.
cleanup-xss-and-mass-assignment.ts: neue cleanupConsents() läuft
beim Container-Start, normalisiert source per Whitelist auf
"unknown" + stripHtml über version/documentPath.
Live-verifiziert auf dev (alle drei Payloads geblockt + Cleanup
auf dirty DB greift).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -239,13 +239,25 @@ const USER_CREATE_FIELDS = [
|
||||
* Defense-in-Depth speichert lieber gleich nichts Bösartiges.
|
||||
* Pentest Runde 11 (2026-05-18), M2: <script>alert(1)</script> in
|
||||
* companyName landete vorher ungefiltert in der DB.
|
||||
*
|
||||
* Pentest 2026-05-20 (LOW): zusätzlich werden Skript-URI-Schemata
|
||||
* unschädlich gemacht (`javascript:`, `data:`, `vbscript:`). Plain-Text-
|
||||
* Felder enthalten legitime URLs ohnehin selten; ein gespeicherter
|
||||
* `javascript:alert(1)` würde ansonsten in einem `<a href={value}>`
|
||||
* sofort feuern.
|
||||
*/
|
||||
const DANGEROUS_URI_SCHEMES = /(?:javascript|data|vbscript)\s*:/gi;
|
||||
|
||||
export function stripHtml(value: unknown): unknown {
|
||||
if (typeof value !== 'string') return value;
|
||||
return value
|
||||
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
|
||||
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
|
||||
.replace(/<\/?[a-z][^>]*>/gi, '');
|
||||
.replace(/<\/?[a-z][^>]*>/gi, '')
|
||||
// Schema durch harmloses Token ersetzen – komplette Entfernung
|
||||
// könnte legitimen Text wie "Java Script :)" verändern, dieses
|
||||
// Pattern matcht nur das Schema selbst.
|
||||
.replace(DANGEROUS_URI_SCHEMES, 'blocked:');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user