@maxammann
11. Juni, 2019
Quelle: PoC||GTFO 0x03
Ein Exploit nutzt eine Vulnerability um eine bestimmte unerwartete Aktion auszuführen.
alert("XSS")
<div><script title="</div>">
<script><div title="</script>">
Aktuelle HTML-Parser sind zu komplex und zu unterschiedlich.
▶ Serverseitige Sanitisation ist nicht ausreichend!
<template>
<noscript><p title="</noscript><img src=x onerror=alert("XSS")>">
Der DOM Tree ist je nach Kontext unterschiedlich, obwohl der ursprüngliche HTML-Code der gleiche ist!
The noscript element represents nothing if scripting is enabled, and represents its children if scripting is disabled.
Da in einem <template>
tag scripting deaktiviert ist, werden unterschiedliche DOM Trees gebaut.
Quelle: https://www.w3.org/TR/html52/semantics-scripting.html#the-noscript-element
Severity: Very High
Vulnerability bestand in der Google Suche für 4 Monate!
Quelle: Google I/O 2019: Securing Web Apps with Modern Platform Features
Content-Security-Policy
to the rescue
CSP is a strong defense-in-depth mechanism against XSS.
Quelle: https://www.w3.org/TR/CSP3/
Verbietet inlinen von JavaScript und lässt nur bestimmte Quellen zu.
Wie sieht eine typische XSS aus?
Idee: String → TrustedHTML
const Policy = TrustedTypes.createPolicy('myPolicy', {
createHTML(s: string) => myCustomSanitizer(s)
}, false)
<?php
if (empty($_POST['hmac']) || empty($_POST['host'])) {
header('HTTP/1.0 400 Bad Request'); exit;
}
$secret = getenv("SECRET");
if (isset($_POST['nonce']))
$secret = hash_hmac('sha256', $_POST['nonce'], $secret);
$hmac = hash_hmac('sha256', $_POST['host'], $secret);
if ($hmac !== $_POST['hmac']) {
header('HTTP/1.0 403 Forbidden'); exit;
}
echo exec("host ".$_POST['host']);
?>
Quelle: www.securify.nl/en/blog/SFY20180101/spot-the-bug-challenge-2018-warm-up.html
XSS Vektoren: https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet