Level 2 – Einfache Serververwaltung (Minimal)
Version vom 25. März 2026, 13:47 Uhr von Thomas.will (Diskussion | Beiträge) (→SQL Injection beim Löschen)
Level 2 – Benutzerverwaltung und erste Sicherheitsprobleme
Voraussetzung
- Level 1 muss vollständig umgesetzt und funktionsfähig sein
- Die Serververwaltung ist erreichbar unter:
http://SERVER-IP/
Ziel
- Einführung einer einfachen Benutzeranmeldung
- Schutz von Funktionen (Eintragen/Löschen)
- Aufzeigen von Sicherheitsproblemen (SQL Injection)
Erweiterung der Datenbank
- Anmeldung an MariaDB
mysql -u root
- Datenbank auswählen
use serververwaltung;
- Tabelle für Benutzer anlegen
create table benutzer ( id int auto_increment primary key, benutzername varchar(50), passwort varchar(50) );
- Beispielbenutzer anlegen
insert into benutzer values (null, 'admin', 'admin'); insert into benutzer values (null, 'user', 'user');
PHP Sessions
Datei: login.html
- Einfaches Login-Formular für Benutzer
- Sendet die Daten per POST an login.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h2>Login</h2> <form method="post" action="login.php"> Benutzername: <input type="text" name="benutzername"><br> Passwort: <input type="password" name="passwort"><br> <input type="submit" value="Login"> </form> </body> </html>
Datei: login.php
- Prüft Benutzername und Passwort gegen die Datenbank
- Setzt eine Session bei erfolgreichem Login
<?php
include 'db.php';
session_start();
$benutzername = $_POST['benutzername'];
$passwort = $_POST['passwort'];
$sql = "SELECT * FROM benutzer WHERE benutzername='$benutzername' AND passwort='$passwort'";
$result = $conn->query($sql);
if ($result->num_rows == 1) {
$_SESSION['user'] = $benutzername;
header("Location: index.php");
} else {
echo "Login fehlgeschlagen";
}
?>
Anpassung: index.php
- Anzeige, ob ein Benutzer eingeloggt ist und Löschfunktion
<?php session_start(); include 'db.php'; $result = $conn->query("SELECT * FROM server"); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Serververwaltung</title> </head> <body> <?php if (isset($_SESSION['user'])) { echo "Eingeloggt als: " . $_SESSION['user'] . "<br>"; } else { echo "<a href='login.html'>Login</a><br>"; } ?> <h2>Neuen Server eintragen</h2> <form method="post" action="add.php"> Rechnername: <input type="text" name="rechnername" required><br> IP-Adresse: <input type="text" name="ip_adresse" required><br> Betriebssystem: <input type="text" name="betriebssystem" required><br> Festplatte (GB): <input type="number" name="festplattenspeicher" required><br> RAM (GB): <input type="number" name="ram" required><br> Hauptdienst: <input type="text" name="hauptdienst" required><br> <input type="submit" value="Speichern"> </form> <h2>Serverliste</h2> <?php if ($result->num_rows > 0) { echo "<table border='1'>"; echo "<tr><th>ID</th><th>Name</th><th>IP</th><th>OS</th><th>Disk</th><th>RAM</th><th>Dienst</th><th>Aktion</th></tr>"; while ($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".$row["rechnername"]."</td>"; echo "<td>".$row["ip_adresse"]."</td>"; echo "<td>".$row["betriebssystem"]."</td>"; echo "<td>".$row["festplattenspeicher"]."</td>"; echo "<td>".$row["ram"]."</td>"; echo "<td>".$row["hauptdienst"]."</td>"; echo "<td><a href='delete.php?id=".$row["id"]."'>löschen</a></td>"; echo "</tr>"; } echo "</table>"; } else { echo "Keine Server vorhanden."; } ?> </body> </html>
Schutz von Funktionen
- Eintragen und Löschen nur für eingeloggte Benutzer erlauben
Anpassung: add.php
<?php include 'db.php'; session_start(); if (!isset($_SESSION['user'])) { die("Nicht eingeloggt"); } if ($_SERVER["REQUEST_METHOD"] == "POST") { $rechnername = $_POST["rechnername"]; $ip_adresse = $_POST["ip_adresse"]; $betriebssystem = $_POST["betriebssystem"]; $festplattenspeicher = $_POST["festplattenspeicher"]; $ram = $_POST["ram"]; $hauptdienst = $_POST["hauptdienst"]; $sql = "INSERT INTO server (rechnername, ip_adresse, betriebssystem, festplattenspeicher, ram, hauptdienst) VALUES ('$rechnername', '$ip_adresse', '$betriebssystem', '$festplattenspeicher', '$ram', '$hauptdienst')"; if ($conn->query($sql) === TRUE) { header("Location: index.php"); exit; } else { echo "Fehler: " . $conn->error; } } ?>
Neue Datei: delete.php
- Löscht einen Server über die ID (unsicher!)
<?php
include 'db.php';
session_start();
if (!isset($_SESSION['user'])) {
die("Nicht eingeloggt");
}
$id = $_GET['id'];
$sql = "DELETE FROM server WHERE id = $id";
if ($conn->query($sql)) {
echo "Server gelöscht";
} else {
echo "Fehler";
}
?>
Test
- Login aufrufen
http://SERVER-IP/server/login.html
- Mit admin/admin anmelden
- Server eintragen
- Server löschen testen
Sicherheitsprobleme (bewusst eingebaut)
SQL Injection im Login
- Eingabe im Login-Feld:
' OR 1=1 --
- Ergebnis:
- Login funktioniert ohne gültige Zugangsdaten
SQL Injection beim Löschen
- URL manipulieren:
http://SERVER-IP/delete.php?id=1 OR 1=1
- Ergebnis:
- Alle Datensätze werden gelöscht
Klartext-Passwörter
- Passwörter werden unverschlüsselt gespeichert
- Jeder mit Datenbankzugriff kann sie lesen
Ergebnis
- Teilnehmer erkennen:
- Login ≠ Sicherheit
- Unsichere SQL-Abfragen sind gefährlich
- Eingaben dürfen nicht ungeprüft verarbeitet werden