Über SQL-Injektion spreche ich oft und gerne, weil es eine bedeutende Sicherheitslücke in vielen PHP-Quelltexten ist. Direkt dadurch kam mir auch in den Sinn, dass man auch PHP irgendwie “initieren” kann. Heute habe ich mir deshalb eine einfache Aufgabe gestellt:
Aufgabe: Entführe die GET-Daten und gebe die Variable $passwd_db aus:
<?php
$passwd_db = "MySQL-Passwort-das-ganz-lang-ist";
echo $_GET['hack'];
?>
1.Schritt: Verhalten dokumentieren. Ich habe eine Ergebnistabelle erstellt, um die Lösung schneller zu finden:
| Aufruf: | Ergebnis: |
?hack="; echo $passwd_db; echo " |
"; echo $passwd_db; echo " |
?hack=echo $passwd_db; |
echo $passwd_db; |
?hack=<?php echo $passwd_db; ?> |
|
?hack=$passwd_db |
$passwd_db |
?hack=<?php echo "true"; ?> |
|
2.Schritt: Parser. Um jetzt nicht einfach darauf los zu testen, habe ich mich gefragt, durch welche das Skript läuft:
| HTML: | sinnlos |
| CSS: | sinnlos |
| PHP: | unbekannt; erst starten? schon aktiv? |
Wird der Text einfach ersetzt? Also ?hack=<?php echo "true"; ?> ergibt im Quelltext echo <?php echo "true"; ?>. Das bezweifle ich, weil das sehr unsicher klingt. Also müsste ich bereits innerhalb der Conditional Comments sein.
3.Schritt: Aus Verhalten schlußfolgern.
" |
wird escaped: “ |
<?php ?> |
alles zwischen den CC wird ausgelassen. |
Ich komme zu dem Schluß, dass alles zwischen <?php ?> ignoriert wird, da es eine erhebliche Sicherheitslücke wäre. Deshalb hat diese Aufgabe keine Lösung… zum Glück.
PS:
Sehr leicht wäre es mit eval (und sehr kriminell!).
<?php echo eval($_GET['hack']); // Sicherheitslücke eval() ?>
<?php echo htmlspecialchars($_GET['hack']); // Die einfachste Sicherheitsvorkehrung für das obrige Bsp. ?>
Recent Comments