XSS-Sanitization für AppSettings (companyName & Co)
Pentest-Befund (MEDIUM): companyName und weitere Plain-Text-Setting- Keys nahmen via PUT /api/settings/:key XSS-Payloads wie <img src=x onerror=alert(1)> ungefiltert entgegen. Nur Admin triggerbar, aber E-Mail-Templates/PDF-Generatoren hätten den Wert unescaped rendern können. Fix in appSetting.service.ts: sanitizeSettingValue(key, value) strippt HTML außer für die expliziten Editor-Keys (imprintHtml, privacyPolicyHtml, authorizationTemplateHtml, websitePrivacyPolicyHtml). Greift in updateSetting + updateSettings. cleanup-xss-and-mass-assignment.ts bereinigt bestehende dreckige Werte beim Container-Start (idempotent). Live-verifiziert auf dev: - PUT companyName="<img onerror=alert(1)>OpenCRM<script>alert(2)</script>" → DB: "OpenCRM" - Bulk-PUT mit XSS auf companyName + defaultEmailDomain → gestrippt - imprintHtml mit "<h1>...<p>" → unverändert (HTML-allowed) - Cleanup-Skript auf dirty value: "EvilCo" statt mit Tags Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -53,7 +53,10 @@ export async function updateSetting(req: AuthRequest, res: Response): Promise<vo
|
||||
// Vorherigen Stand laden für Audit
|
||||
const before = await prisma.appSetting.findUnique({ where: { key } });
|
||||
const oldValue = before?.value ?? '-';
|
||||
const newValue = String(value);
|
||||
// HTML-Tags aus Plain-Text-Keys strippen, bevor sie in der DB landen.
|
||||
// Pentest 2026-05-19, MEDIUM: companyName="<img onerror=...>" landete
|
||||
// sonst ungefiltert in E-Mail-Templates / PDFs.
|
||||
const newValue = appSettingService.sanitizeSettingValue(key, String(value));
|
||||
|
||||
await appSettingService.setSetting(key, newValue);
|
||||
|
||||
@@ -104,7 +107,7 @@ export async function updateSettings(req: AuthRequest, res: Response): Promise<v
|
||||
for (const [key, value] of Object.entries(settings)) {
|
||||
const before = await prisma.appSetting.findUnique({ where: { key } });
|
||||
const oldValue = before?.value ?? '-';
|
||||
const newValue = String(value);
|
||||
const newValue = appSettingService.sanitizeSettingValue(key, String(value));
|
||||
if (oldValue !== newValue) {
|
||||
changes[key] = { von: oldValue, nach: newValue };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user