This page has been robot translated, sorry for typos if any. Original content here.

Einige Schwachstellen Web-Ressourcen, die SQL verwenden


In dem Artikel betrachten wir die Verwundbarkeit von SQL, im Zusammenhang mit dem Eindringen in den Körper des Antrags.

Das Wesen der Verwundbarkeit

Betrachten wir die Arbeit von einem sehr einfachen System mit WEB-Interface, mit dem Benutzer zu schützen und Informationen über sich selbst zu ändern. Solche Systeme sind unter dem Netzwerk sehr häufig. Es kann auch ein Gästebuch und Chat, und Fotogalerie, und die Post sein.

Die generierte Datenbankabfrage danyh gezwungen, einen Benutzernamen und ein Passwort vom Benutzer eingegeben zu haben. Für diese Felder, um die Datenbank den entsprechenden Eintrag in der Tabelle zu finden. Nach der Anforderung Finishing bietet die Datenbank die Informationen über den Benutzer gefunden, die ein PHP-Skript in HTML aufstellt, gibt dem Benutzer.

Rascmotrim ziemlich typisch PHP-Skript-Fragment, das eine SQL-Abfrage verwendet die Datenbank zuzugreifen:

<? Php
$ Result = mysql_db_query ( "Datenbank" , "select * from usertable wo login = '$ Userlogin' und password = '$ userpassword'");
while ($ row = mysql_fetch_array ($ result)) {
$ Row [ "fullname"] Echo ;
$ Row [ "Email"] Echo ;
$ Row [ "password"] Echo ;
}
mysql_free_result ($ result);
?>

Wie beobachtet, das Login und Passwort durch den Benutzer eingegeben werden in der Variablen $ Userlogin wie $ userpassword enthalten. Der Inhalt dieser Variablen vstyavlyaetsya die Abfrage der Informationen über den Benutzer zu filtern. Der Filter wird durch select SQL - Befehl , wo Optionen angegeben. In diesem Fall ist die Anfrage wie folgt: select * from usertable wo login = ‚$ Userlogin‘ und password = ‚$ userpassword‘ , wo usertable - Name der Tabelle , die notwendigen Informationen enthält. Wenn die Variablen Benutzernamen und Passwort - Werte enthalten Wanja auch entsprechend Wasja, die Anforderung, die Datenbank sendet wird wie folgt aussehen: select * from usertable wo login = ‚vanya‘ und password = ‚vasya‘. Es ist klar , dass , wenn die Datenbank in Abwesenheit eines Datensatz ist, die das Login - Passwort ist aber vanya - vasya, bis die Anfrage nicht eine einzige Zeile aus der Datenbank, und das Skript nicht alles geben gesendet haben. Somit stellt das vorliegende System Zugriff auf die Informationen nur für einen Benutzer, der ein untrügliches Passwort und Login hat.

Es scheint, dass ein solches System nicht für Mängel enthält. In der Sitzung, ist es nicht. Programmictov Logik, das obige Beispiel zu erstellen, vorausgesetzt , dass Sie Ihr Login und Passwort eingegeben werden in einfachen Anführungszeichen enthalten sein, die mit dicht gepackt sind , im Körper des Antrags. Allerdings wollen wir sehen, was passiert, wenn persönlich geschieht Passwort eingegeben polzovaetelm ein Anführungszeichen enthält. Lassen Sie es hält Wert vas'ya, während die Anforderung die Form wird: select * from usertable wo login = ‚vanya‘ und password = ‚vas'ya‘. Bei der Durchführung eines solchen Antrags, wird es sicherlich einen Fehler, weil das Zitat aus dem Passwort, das Öffnen Zitat aus dem Antrag geschlossen, und das Ende des Passworts ‚ya‚hängen‘bleibt , ist an Bedingungen geknüpft.

Und wenn Sie das Passwort die folgende Zeile einzufügen: ‚oder 1 = 1‘, dann wird die Anfrage so sein :: select * from usertable wo Login = ‚vanya‘ und password = ‚‘ oder 1 = 1 ‚‘ und wurde nicht einen Syntaxfehler haben . Aber der logische Ausdruck würde gleich wahr sein, in Widerspruch zu dieser Anfrage, gibt die SQL die gesamte Benutzerdatenbank 8).

Damit das Apostroph verwenden, können wir in SQL Anfrage Körper prniknut machen es auch so, dass eine Testbedingung wahr zu sein wäre. Wenn wir in einem bestimmten Benutzer interessiert sind vanya, dann Informationen über sie erhalten, darf ein Passwort Zeichenfolge verwenden: ‚oder = login‘ vanya. In diesem Fall wird ein solcher Antrag wäre: select * from usertable wo login = ‚vanya‘ und password = ‚‘ oder = login ‚vanya‘. Wie Sie sich vorstellen können, als Ergebnis erhalten wir Informationen über genau das, was vanya.

Die Anfälligkeit von Dienstleistungen auf der Basis der SQL, nicht auf den unberechtigten begrenzt von Informationen zu erhalten. Da solche Systeme in der Regel verwendet, MySQL, ist es nicht nur möglich, den Bedingungsausdruck in dem Team auszuwählen, zu modifizieren, sondern auch über den Befehl zu gehen, auch eine anderen Befehl Datenbank ausführen. Da MySQL mehrere Befehle in einer einzigen Abfrage ermöglicht, voneinander getrennt sind ; , Können wir einen dieser Befehle, geben Sie in das Passwortfeld den folgenden Code ausführen: ‚; <KomandaSQL> in welchem Ort als <komandaSQL> jeden gültigen Befehl angeben dürfen. Zum Beispiel die folgenden Code ein : ‚; drop table ‚usertable einfach nur usertable Tabelle aus der Datenbank zerstören.

Praktische Anwendung der Verwundbarkeit

Trotz seiner Einfachheit fragt die praktische Anwendung von SQL-Fehler sehr schwierig sind.

In diesem Sinne sollten Sie die folgenden Probleme, die auftreten, wenn Sie diese Sicherheitsanfälligkeiten verwenden:
  • Die Bestimmung, ob die Verwendung von SQL in dem System.
  • Identifizierung der Existenz einer Sicherheitslücke. Aufklärung von Reaktionsskriptfehler.
  • Definition der Feldnamen in der Tabelle.
  • Identifizieren Sie vorhandene Tabellennamen.

    Betrachtet Verletzlichkeit inhärent in allen SQL-Abfragen, unabhängig von der Skript oder Programm, in dem sie aufgerufen werden. Trotzdem werden wir ein System auf Basis von PHP in Betracht ziehen. Dies ist aufgrund der Tatsache, dass der Fluss von PHP-Fehler, wenn die Position (der Standard) wird an den Endbenutzer gesendet. Zu dieser Zeit als Perl oder Exe Application in der Regel nicht um den Benutzer über die Art des Fehlers zu informieren.

    Die Bestimmung , ob die Verwendung von SQL in dem System.

    Wenn Sie ein bestimmtes System untersuchen, ob es die SQL verwendet, müssen Sie zuerst herausfinden.
    Diese Tatsache erlaubt zu offenbaren oder indirekte Weise (Überprüfung der Namen der Dateien, Links zu den eingesetzten Mitteln und so weiter), oder direkt - zwingt SQL, sich auszudrücken. Wenn wir mit PHP raboatem, dann gibt es nur ein Mittel die Verwendung von SQL eindeutig zu bestimmen - ist es, die Fehler ihrer Umsetzung zu nennen. Wenn Sie eine Abfrage Fehler ausgeführt auftritt, sondern werden auch PHP-Skript Fehler eindeutig nicht vyponeniya nicht verarbeitet, wird die Nachricht über die PHP-Fehler aus direkt auf die Seite des Benutzers.
    Wie der Fehler der SQL-Abfrage fordert die Auflösung der Vorrichtung des Systems abhängt. In den meisten Fällen wird der Fehler durch die Eingabe fehlerhaften Daten in das System anrufen dürfen.

    Identifizierung der Existenz einer Sicherheitslücke. Aufklärung von Reaktionsskriptfehler.

    Die unsophisticated Mittel zum Nachweis der Anwesenheit von Verletzlichkeit Detektieren jedoch zugleich auch SQL Tatsache verwendet , ist danach: In jedem Bereich, der vermutlich an der Bildung von SQL - Abfrage beteiligt ist (z Anmeldung Feld oder Passwort) Eintrag Apostroph Charakter. Andere Felder ausfüllen keine gültigen Daten (entweder leer bleiben, wenn durch das System erlaubt). Senden von Daten bilden, an der Systemantwort suchen. Wenn das Ergebnis des PHP-Skript uns einen SQL-Fehler gibt, können wir uns gratulieren: Das System verwendet ein SQL-Skript auch einen Apostroph nicht filtern. Dann essen Sie ein System verwundbar ist.
    Fehler SQL-Abfrage in diesem Fall sein wird, sehen Sie die Seite wie folgt aus:

    Dateneingabeformular:


    Als Ergebnis der Fehler-SQL - Abfrage:


    Wenn der SQL-Fehlercode auf der Seite nicht vorhanden ist, könnte es bedeuten folgendes:
    1) Das System enthält eine Schwachstelle, sondern ein PHP-Skript behandelt Fehler. In diesem Fall wird das System zu knacken erlaubt, sondern handeln muß, „berühren“, weil wir nicht die SQL-Syntax wissen, zu welchem ​​Zeitpunkt richtig sein, aber es ist, zu welchem ​​Zeitpunkt.
    2) Das Skript filtert das Zitat auch, weil der Fehler nicht auftritt. In diesem Fall wird das System nicht die Verletzlichkeit enthält.
    3) das allgemeine System wird von SQL nicht verwendet.
    In den letzten paar Fällen ist es klar, dass weitere Forschung ist SQL bedeutet nicht besitzt.

    Definition der Feldnamen in der Tabelle.

    Um Informationen aus einer Datenbank mit spezifischen Daten zu erhalten, müssen wir die Bedeutung einiger Felder in der Abfrage (zB geben Sie eine Benutzer-Login) definieren. Und doch muss es den Namen der entsprechenden Felder kennen. Direkt ist nicht möglich, diese Namen zu kennen. So wird es ein Verfahren zum Sortieren, diese Namen zu finden. Diese Namen können die gleichen sein wie die Feldnamen in der Form an den Server gesendet und kann auch nicht gleich sein. Gute Lektion, dass die Feldnamen sowie die Position des Standard Schreibweisen sie nicht so sehr. Zum Beispiel ist der Feldname für die Benutzername wahrscheinlich eine Benutzeranmeldung oder Nick sein. Ähnlich wie das Passwort: Passwort oder PWD oder Pass.
    Um die Existenz eines bestimmten Feld zu bestimmen, wird es ingenuous Verfahren vorgeschlagen: Angenommen , wir testen wollen , ob ein PWD Feld in der Tabelle ist. Wir stellen jedes solches Formularfeld ‚pwd =‘ string. Wenn das PWD - Feld in der Tabelle vorhanden ist , verarbeitet SQL korrekt die Anforderung, wenn bla bla dieses Feld nicht vorhanden ist, wird es wieder SQL Fehler anzeigt . So können unterschiedliche Werte für die Feldnamen als Ergebnis der Prüfung des Fertig Anfrage ersetzen, können wir herausfinden, welche Felder in der Tabelle existieren, aber was nicht.

    Identifizieren Sie vorhandene Tabellennamen.

    In ähnlicher Weise wird das Verfahren zum Auffinden der Feldnamen in den Tabellen erlaubt, die Namen von vorhandenen Tabellen in der Datenbank zu suchen. Angenommen , wir wollen herausfinden , ob es eine Grundlage in Adminlist - Tabelle. Dazu führen wir Nektorov Feld eine Zeile wie ‚bilden; select * from Adminlist. Wenn das Ergebnis des Fehlers SQL nicht startet, dann existiert Adminlist - Tabelle. Für die Richtigkeit dieses Tests, müssen Sie diese Zeichenfolge in das Feld eingeben, die in einer SQL-Abfrage erscheint krönen. Damit soll sichergestellt werden, dass nicht durch einen Syntaxfehler verursacht würde aufgrund des verbleibenden „Schwanz“ der ursprünglichen Anforderung, die vorhanden sein wird später select * from Adminlist. Beachten Sie, dass , wenn das Formular zu beantragen Anmeldung ein Paar Feld und Passwort besitzt, dann ist es sehr wahrscheinlich es ist , das Passwort - Feld in der letzten Anfrage angezeigt.

    PS

    Mit dieser Sicherheitsanfälligkeit wurde die Website gehackt http://www.bigmir.net (genauer gesagt seine Fotogalerie und Chat). Wir sobschili die Verwundbarkeit der Website-Betreiber. Das Loch war pofiksina. Aber jetzt haben wir ein Anmeldeformular Chat geprüft. Plus Ich fand das alles bla bla Verwundbarkeit 8-).