Patientendaten maskieren und SQL-Injection in togoadmin entfernen

Stored XSS
Die Anfrageuebersicht und das Antwortformular haben Nachricht, Medikamente,
Dateiname und Adressdaten des Patienten roh in HTML-Strings gesetzt.
Gespeichert wird der Text nur mit trim(), ein Patient konnte darueber
Skriptcode in den Browser der Mitarbeiterin einschleusen - mit deren
Sitzung. Die Werte laufen jetzt beim Auslesen durch e(). Der dritte Zweig
(Antwort einsehen) maskierte bereits bei der Ausgabe und bleibt, wie er
ist.

SQL-Injection
togoadmin.php interpolierte $_GET["id"] an drei Stellen ungecastet in
UPDATE-Statements, waehrend die Nachbarzeilen bereits (int) verwenden.
Dazu drei reflektierte Ausgaben desselben Wertes in Formularfelder.
Beides auf (int) umgestellt.

Formularziele
$_SERVER['PHP_SELF'] enthaelt bei Aufrufen wie /admin/anfragen.php/"><script>
auch den angehaengten Pfad und landete an 72 Stellen ungeprueft im HTML.
Ersetzt durch self_action() aus inc/security.inc.php, das den Basisnamen
des Skripts maskiert zurueckgibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 14:19:13 +02:00
co-authored by Claude Opus 5
parent 19f1ac7ec8
commit 86115b18a7
2 changed files with 101 additions and 96 deletions
+30 -31
View File
@@ -1,5 +1,4 @@
<?php
session_start();
// WICHTIG: Pfade aus /admin heraus korrekt auflösen
require_once __DIR__ . "/../inc/config.inc.php";
@@ -24,7 +23,7 @@ include("templates/footer.inc.php");
<?php
echo '<div style="float: right; width: 200px; ">';
echo "<form action='". $_SERVER['PHP_SELF'] . "' id='formbenutzersuche' method=POST>";
echo "<form action='". self_action() . "' id='formbenutzersuche' method=POST>";
echo '<input type="hidden" name="aktion" value="benutzersuche" />';
echo '<input type="hidden" name="userid_input" id="userid_input" />';
echo '<label>Benutzersuche Impfen:</label>
@@ -55,7 +54,7 @@ if(!check_worker()){
<?php
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "Wochentag:<br>";
echo "<select name=date>";
echo "<option value=Mo>montags</option>";
@@ -91,14 +90,14 @@ if(!check_worker()){
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";
}elseif($_POST["aktion"] == "folgenewtermin"){
echo "<h3>Folge von Terminen anlegen</h3><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "Datum: <input name=date type=date class='form-control' required><br>";
echo "Startzeit: <input name=folgestartzeit type=time class='form-control' required><br>";
echo "Länge eines Termins (Min): <input name=folgelaenge type=number class='form-control' required><br>";
@@ -112,7 +111,7 @@ if(!check_worker()){
echo '<input type=submit class="btn btn-primary" value="Neue Zeitslots anlegen"></form>';
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";
@@ -128,7 +127,7 @@ if(!check_worker()){
$sqlstring = "DELETE FROM togo_termin_teilnehmer WHERE terminteilnehmerid = " . (int)$_GET["uid"];
$query = mysqli_query($con,$sqlstring);
if($query){
$sqlstring = "Update togo_termin SET count=count-1 WHERE terminid = ". $_GET["id"] . "";
$sqlstring = "Update togo_termin SET count=count-1 WHERE terminid = " . (int)($_GET["id"] ?? 0);
$query = mysqli_query($con,$sqlstring);
echo "<div class='infofenster'><h4>Eintrag wurde gelöscht!<h4></div>";
@@ -153,14 +152,14 @@ if(!check_worker()){
$togoid = $row["IP"];
$togodate = $row["create_time"];
echo "<tr><td>" . $i . "</td><td>". $togoname ." - " . $togomail . "</td><td>" . $togoid . "</td><td>" . $togodate . "</td><td> <a href=". $_SERVER["PHP_SELF"] ."?a=showtogotermin&b=removeentry&id=$terminid&uid=$terminteilnehmerid class='glyphicon glyphicon-remove' onclick=\"return confirm('Eintrag ". $togoname ."/". $togomail." wirklich löschen?');\" title='löschen'></a> </td></tr>";
echo "<tr><td>" . $i . "</td><td>". $togoname ." - " . $togomail . "</td><td>" . $togoid . "</td><td>" . $togodate . "</td><td> <a href=". self_action() ."?a=showtogotermin&b=removeentry&id=$terminid&uid=$terminteilnehmerid class='glyphicon glyphicon-remove' onclick=\"return confirm('Eintrag ". $togoname ."/". $togomail." wirklich löschen?');\" title='löschen'></a> </td></tr>";
$i++;
}
echo "</table>";
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoterminverwaltung >";
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";
@@ -183,7 +182,7 @@ if(!check_worker()){
}
echo "<h3>Termin Anpassung</h3>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "Datum:<br>";
echo "<input type=date name=date class='form-control' value=$date>";
@@ -208,14 +207,14 @@ if(!check_worker()){
echo "<input type=int name=error class='form-control' value=$error>";
echo "<br><br>";
echo "<input type=hidden name=save value=saveediteinzeltermin >";
echo "<input type=hidden name=terminid value=". $_GET["id"] . " >";
echo "<input type=hidden name=terminid value=" . (int)($_GET["id"] ?? 0) . " >";
echo '<input type=submit class="btn btn-primary btn-sm" value="Termin speichern">';
echo "</form>";
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
//echo "<input type=hidden name=aktion value=togoterminverwaltung >";
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
@@ -243,14 +242,14 @@ if(!check_worker()){
Standort: $standort<br>
<br>";
echo "<form action='". $_SERVER['PHP_SELF'] . "' method=POST>";
echo "<form action='". self_action() . "' method=POST>";
echo "Betreff:<br>";
echo "<input name=betreff type=text class='form-control' ><br>";
echo "<div id=my-editor></div>";
echo "Inhalt:<br>";
echo '<textarea height=200 name="body" id="trumbowyg-demo"></textarea>';
echo "<input name=save type=hidden value=savesendmail>";
echo "<input name=id type=hidden value='". $_GET["id"] . "'><br><br>";
echo "<input name=id type=hidden value='" . (int)($_GET["id"] ?? 0) . "'><br><br>";
echo "<input type=submit value='Speichern'><br>";
echo '</form>';
}else if($_GET["a"] == "togomaildeletetimes" ){
@@ -261,7 +260,7 @@ if(!check_worker()){
echo "Hiermit werden alle Benutzer mit abgesagten Terminen informiert und die Einträge dann gelöscht.<br>";
echo "<form action='". $_SERVER['PHP_SELF'] . "' method=POST>";
echo "<form action='". self_action() . "' method=POST>";
echo "Betreff:<br>";
echo "<input name=betreff type=text class='form-control' ><br>";
echo "<div id=my-editor></div>";
@@ -288,7 +287,7 @@ if(!check_worker()){
}
echo "<h3>Serientermin Anpassung</h3>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoeditserientermin class='form-control'>";
echo "Wochentag:<br>";
@@ -358,7 +357,7 @@ if(!check_worker()){
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoterminverwaltung >";
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";
@@ -370,7 +369,7 @@ if(!check_worker()){
}elseif($_GET["a"] == "togoAddUser" || $_POST["aktion"] == "togoAddUser" ){
$textausgabe .= "<h3>ToGo Anmeldung</h3>";
$textausgabe .= '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
$textausgabe .= '<form action="'. self_action() .'" method=POST>';
$textausgabe .= "Melden Sie sich unverbindlich an.<br>Es wird Ihre IP-Addresse gespeichert.<br><br><h3>Dieses dient nur zur Planung und ist keine feste Terminzusage!</h3>";
$textausgabe .= "Bitte beachten Sie, dass die angezeigte Anzahl der Online Anmeldungen vom tatsächlichen Andrang vor Ort abweichen kann.<br>Auch ist eine Verschiebung der Impfung für einzelne Impflinge immer möglich!<br><br>";
$textausgabe .= "";
@@ -384,7 +383,7 @@ if(!check_worker()){
$textausgabe .= "<input type=hidden name=save value=saveadduser >";
//$textausgabe .= "<input type=hidden name=aktion value=togoAddUser >";
$textausgabe .= "<input type=hidden name=ip value='PraxisTeam Eintrag' >";
$textausgabe .= "<input type=hidden name=terminid value='".$_GET["id"] ."' >";
$textausgabe .= "<input type=hidden name=terminid value='" . (int)($_GET["id"] ?? 0) . "' >";
$textausgabe .= '<input type=submit class="btn btn-primary btn-sm" value="Unverbindlich anmelden"><br>';
$textausgabe .= "</form>";
$textausgabe .= "<br><br>Bitte beachten Sie, dass die angezeigte Anzahl der Online Anmeldungen vom tatsächlichen Andrang vor Ort abweichen kann.<br>Auch ist eine Verschiebung der Impfung für einzelne Impflinge immer möglich!<br><br>";
@@ -399,7 +398,7 @@ if(!check_worker()){
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=date name=date class='form-control'>";
echo "<br><br>";
@@ -423,7 +422,7 @@ if(!check_worker()){
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";
@@ -453,7 +452,7 @@ if(!check_worker()){
if($_GET["a"] == "activetogotermin" ){
$sqlstring = "Update togo_termin SET count='0' WHERE terminid = ". $_GET["id"] . "";
$sqlstring = "Update togo_termin SET count='0' WHERE terminid = " . (int)($_GET["id"] ?? 0);
$query = mysqli_query($con,$sqlstring);
if($query){
echo "<div class='infofenster'><h4>Termin wurde aktiviert!<h4></div>";
@@ -465,7 +464,7 @@ if(!check_worker()){
}
if($_GET["a"] == "removetogotermin" ){
$sqlstring = "Update togo_termin SET count='-1' WHERE terminid = ". $_GET["id"] . "";
$sqlstring = "Update togo_termin SET count='-1' WHERE terminid = " . (int)($_GET["id"] ?? 0);
$query = mysqli_query($con,$sqlstring);
if($query){
@@ -815,11 +814,11 @@ $queryinsert = $stmt->execute([
$togostandort = $row["standort"];
$togowarning = $row["warning"];
$togoerror = $row["error"];
echo "<tr><td>" . $ausgabedate . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . " - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td> <a href=". $_SERVER["PHP_SELF"] ."?a=removeserie&id=$togovorgabenid class='glyphicon glyphicon-remove' title='löschen' onclick=\"return confirm('Eintrag " . $ausgabedate . " " . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . " wirklich löschen?');\" ></a></td><td>";
echo "<tr><td>" . $ausgabedate . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . " - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td> <a href=". self_action() ."?a=removeserie&id=$togovorgabenid class='glyphicon glyphicon-remove' title='löschen' onclick=\"return confirm('Eintrag " . $ausgabedate . " " . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . " wirklich löschen?');\" ></a></td><td>";
}
echo "</table><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoterminverwaltungnewserie >";
echo '<input type=submit class="btn btn-primary btn-sm" value="neuer Serientermin">';
echo "</form>";
@@ -842,18 +841,18 @@ $queryinsert = $stmt->execute([
$togoerror = $row["error"];
if($togocount >= 0){
echo "<tr><td>" . date("d.m.y", strtotime($togodate)) . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . "</td><td>Meldung:" . $togocount . " - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td><a href=". $_SERVER["PHP_SELF"] ."?a=togoAddUser&id=$togoterminid class='glyphicon glyphicon-plus' title='Patient hinzufügen'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=showtogotermin&id=$togoterminid class='glyphicon glyphicon-eye-open' title='einsehen'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=togoedittermin&id=$togoterminid class='glyphicon glyphicon-pencil' title='anpassen'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=togosendmail&id=$togoterminid class='glyphicon glyphicon-envelope' title='Mail an alle Teilnehmer'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=removetogotermin&id=$togoterminid class='glyphicon glyphicon-remove' title='deaktiveren'></a> </td></tr>";
echo "<tr><td>" . date("d.m.y", strtotime($togodate)) . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . "</td><td>Meldung:" . $togocount . " - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td><a href=". self_action() ."?a=togoAddUser&id=$togoterminid class='glyphicon glyphicon-plus' title='Patient hinzufügen'></a> <a href=". self_action() ."?a=showtogotermin&id=$togoterminid class='glyphicon glyphicon-eye-open' title='einsehen'></a> <a href=". self_action() ."?a=togoedittermin&id=$togoterminid class='glyphicon glyphicon-pencil' title='anpassen'></a> <a href=". self_action() ."?a=togosendmail&id=$togoterminid class='glyphicon glyphicon-envelope' title='Mail an alle Teilnehmer'></a> <a href=". self_action() ."?a=removetogotermin&id=$togoterminid class='glyphicon glyphicon-remove' title='deaktiveren'></a> </td></tr>";
}else{
echo "<tr><td>" . date("d.m.y", strtotime($togodate)) . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . "</td><td>deaktivert - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td> <a href=". $_SERVER["PHP_SELF"] ."?a=activetogotermin&id=$togoterminid class='glyphicon glyphicon-ok' title='aktivieren'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=showtogotermin&id=$togoterminid class='glyphicon glyphicon-eye-open' title='einsehen'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=togosendmail&id=$togoterminid class='glyphicon glyphicon-envelope' title='Mail an alle Teilnehmer'></a> <a href=". $_SERVER["PHP_SELF"] ."?a=deletetogotermin&id=$togoterminid class='glyphicon glyphicon-remove' title='Dauerhaft löschen' onclick=\"return confirm('Eintrag " . $togodate . " " . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . " wirklich löschen? Serientermine dürfen nicht gelöscht werden, da diese sonst wieder erstellt werden.');\"></a> </td></tr>";
echo "<tr><td>" . date("d.m.y", strtotime($togodate)) . "</td><td>" . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . "</td><td>" . $togostandort . "</td><td>deaktivert - Gelb:" . $togowarning . " Rot:" . $togoerror . "</td><td> <a href=". self_action() ."?a=activetogotermin&id=$togoterminid class='glyphicon glyphicon-ok' title='aktivieren'></a> <a href=". self_action() ."?a=showtogotermin&id=$togoterminid class='glyphicon glyphicon-eye-open' title='einsehen'></a> <a href=". self_action() ."?a=togosendmail&id=$togoterminid class='glyphicon glyphicon-envelope' title='Mail an alle Teilnehmer'></a> <a href=". self_action() ."?a=deletetogotermin&id=$togoterminid class='glyphicon glyphicon-remove' title='Dauerhaft löschen' onclick=\"return confirm('Eintrag " . $togodate . " " . date("H:i", strtotime($togostart)) . " - " . date("H:i", strtotime($togoende)) . " wirklich löschen? Serientermine dürfen nicht gelöscht werden, da diese sonst wieder erstellt werden.');\"></a> </td></tr>";
}
}
echo "</table><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoterminverwaltungnewtogo >";
echo '<input type=submit class="btn btn-primary btn-sm" value="neuer Einzeltermin">';
echo "</form>";
echo "<br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=folgenewtermin >";
echo '<input type=submit class="btn btn-primary btn-sm" value="neue Terminfolge">';
echo "</form>";
@@ -907,10 +906,10 @@ $queryinsert = $stmt->execute([
if( $anzahlzeilen != 0){
echo "<h4>Abgesagte Termine</h4>";
echo "<a href=". $_SERVER["PHP_SELF"] ."?a=togomaildeletetimes title='Mail an alle Teilnehmer' class='btn btn-primary btn-sm'>Mail an alle Teilnehmer bei abgesagten Terminen</a> ";
echo "<a href=". self_action() ."?a=togomaildeletetimes title='Mail an alle Teilnehmer' class='btn btn-primary btn-sm'>Mail an alle Teilnehmer bei abgesagten Terminen</a> ";
}
echo "<br><br>";
echo '<form action="'. $_SERVER["PHP_SELF"] .'" method=POST>';
echo '<form action="'. self_action() .'" method=POST>';
echo "<input type=hidden name=aktion value=togoterminverwaltung >";
echo '<input type=submit class="btn btn-primary btn-sm" value="zurück">';
echo "</form>";