Fehlerberichte sind ein zweischneidiges Schwert für die PHP-Sicherheit. Einerseits kann es die Sicherheit verbessern, andererseits kann es schädlich sein.
Eine gängige Technik beim Angriff auf ein System besteht darin, falsche Daten einzugeben und dann die Art und den Kontext der Fehlermeldung zu überprüfen. Dies hilft Angreifern, Serverinformationen zu sammeln, um Schwachstellen zu finden. Wenn ein Angreifer beispielsweise die Formularinformationen kennt, auf denen eine Seite basiert, versucht er, die Variablen zu ändern:
Beispiel #1 Verwenden Sie eine benutzerdefinierte HTML-Seite, um die Variablen anzugreifen
<form method="post" action="attacktarget?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>
Nach dem Login kopieren
< 🎜 Normalerweise kann die von PHP zurückgegebene Fehlermeldung Entwicklern beim Debuggen des Programms helfen. Sie zeigt an, welche Funktionen oder Codes in welcher Datei Fehler aufweisen, und gibt an, in welcher Zeile der Datei der Fehler aufgetreten ist geben . Viele PHP-Entwickler verwenden die Funktionen show_source(), highlight_string() oder highlight_file() zum Debuggen von Code, aber auf einer Live-Website kann dieser Ansatz versteckte Variablen, ungeprüfte Syntax und andere potenziell gefährliche Systemsicherheitsinformationen offenlegen. Es ist gefährlich, Programme auszuführen, die über interne Debugging-Handler verfügen oder generische Debugging-Techniken verwenden. Wenn ein Angreifer feststellt, welche spezifische Debugging-Technologie vom Programm verwendet wird, versucht er, Variablen zu senden, um die Debugging-Funktion zu aktivieren:
Beispiel #2 Verwenden Sie Variablen, um die Debugging-Funktion zu aktivieren
<form method="post" action="attacktarget?errors=Y&showerrors=1&debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>
Nach dem Login kopieren
Unabhängig vom Fehlerbehandlungsmechanismus bietet die Möglichkeit, Systemfehler zu erkennen, Angreifern mehr Informationen.
Zum Beispiel kann der einzigartige Fehleraufforderungsstil von PHP darauf hinweisen, dass auf dem System PHP ausgeführt wird. Sucht ein Angreifer nach einer .html-Seite und möchte die Technologie dahinter kennen (um Systemschwächen zu finden), übermittelt er falsche Daten und weiß dann, dass das System auf PHP basiert.
Ein einzelner Funktionsfehler könnte die vom System verwendete Datenbank offenlegen oder einem Angreifer nützliche Informationen über eine Webseite, ein Programm oder ein Design liefern. Angreifer folgen häufig den Hinweisen, um offene Datenbank-Ports sowie bestimmte Fehler oder Schwachstellen auf der Seite zu finden. Beispielsweise kann ein Angreifer einige abnormale Daten verwenden, um Programmfehler zu verursachen, um die Reihenfolge der Authentifizierung im Skript (anhand der Zeilennummern in der Fehleraufforderung) und andere Informationen zu erkennen, die an anderer Stelle im Skript durchsickern können.
Ein Dateisystem- oder PHP-Fehler kann Aufschluss darüber geben, welche Berechtigungen ein Webserver hat und wie Dateien auf dem Server organisiert sind. Dieses Problem kann durch fehlerhaften Code, der von den Entwicklern selbst geschrieben wurde, verschärft werden, was zum Verlust ansonsten verborgener Informationen führt.
Es gibt drei gängige Möglichkeiten, mit diesen Problemen umzugehen. Der erste Schritt besteht darin, alle Funktionen gründlich zu überprüfen und zu versuchen, die meisten Fehler zu beheben. Die zweite besteht darin, die Fehlerberichterstattung für Online-Systeme vollständig zu deaktivieren. Die dritte besteht darin, Ihren eigenen Fehlerbehandlungsmechanismus mithilfe der benutzerdefinierten Fehlerbehandlungsfunktion von PHP zu erstellen. Abhängig von der Sicherheitsrichtlinie können alle drei Methoden geeignet sein.
Eine Möglichkeit, dieses Problem zu verhindern, bevor es auftritt, besteht darin, error_reporting() zu verwenden, um Ihren Code sicherer zu machen und gefährliche Verwendungen von Variablen zu finden. Öffnen Sie vor der Veröffentlichung des Programms zunächst den E_ALL-Testcode, der Ihnen dabei helfen kann, die unangemessene Verwendung von Variablen schnell zu finden. Sobald Sie zur Veröffentlichung bereit sind, sollten Sie die Fehlerberichterstattung vollständig deaktivieren, indem Sie den Parameter error_reporting() auf 0 setzen oder display_errors in php.ini auf off setzen, um alle Fehleranzeigen auszuschalten und Ihren Code von der Erkennung zu isolieren. Wenn Sie dies später tun möchten, vergessen Sie natürlich nicht, die Option log_errors in der INI-Datei zu aktivieren und die Datei anzugeben, die zum Aufzeichnen von Fehlerinformationen über error_log verwendet wird.
Beispiel #3 Verwenden Sie E_ALL, um gefährliche Variablen zu finden
<?php
if ($username) { // Not initialized or checked before usage
$good_login = 1;
}
if ($good_login == 1) { // If above test fails, not initialized or checked before usage
readfile ("/highly/sensitive/data/index.html");
}
?>
Nach dem Login kopieren