Heim > Backend-Entwicklung > PHP-Tutorial > SQL-Injection-Analyse in PHP

SQL-Injection-Analyse in PHP

WBOY
Freigeben: 2016-07-29 09:15:02
Original
1027 Leute haben es durchsucht

1. Arten von Injektionsattacken
Es mag viele verschiedene Motivationen für Angriffe geben, doch auf den ersten Blick scheint es, dass es noch viel mehr gibt. Dies trifft sehr zu, wenn ein böswilliger Benutzer eine Möglichkeit findet, mehrere Abfragen durchzuführen. Wir werden dies später in diesem Artikel ausführlich besprechen.
Wie zum Beispiel
Wenn Ihr Skript eine SELECT-Anweisung ausführt, kann ein Angreifer die Anzeige jeder Zeile in einer Tabelle erzwingen, indem er eine Bedingung wie „1=1“ in die WHERE-Klausel einfügt, wie unten gezeigt (wobei die eingefügten Teile fett dargestellt sind). :
SELECT * FROM wines WHERE sorte = 'lagrein' OR 1=1;'

Wie wir bereits besprochen haben, kann dies an sich eine nützliche Information sein, da sie die allgemeine Struktur der Tabelle offenbart (dies ist mit a nicht möglich). (normale Aufzeichnung) und enthüllt möglicherweise Aufzeichnungen, die vertrauliche Informationen enthalten.
Eine aktualisierte Richtlinie stellt möglicherweise eine unmittelbarere Bedrohung dar. Durch Platzieren anderer Attribute in der SET-Klausel kann ein Angreifer jedes Feld im aktuell aktualisierten Datensatz ändern, wie zum Beispiel das folgende Beispiel (in dem der eingefügte Teil fett dargestellt ist):
UPDATE wines SET type='red', 'vintage'='9999' WHERE sorte = 'lagrein'

Durch Hinzufügen einer wahren Bedingung wie 1=1 zur WHERE-Klausel einer Aktualisierungsanweisung wird dieser Änderungsbereich erweitert kann auf jeden Datensatz erweitert werden, wie zum Beispiel im folgenden Beispiel (in dem der Injektionsteil fett dargestellt ist):
UPDATE wines SET type=’red’, ‘vintage’=’9999 WHERE sorte = ‘lagrein’ OR 1=1;’

Die wahrscheinlich gefährlichste Anweisung ist DELETE – das kann man sich nicht schwer vorstellen. Die Injektionstechnik ist die gleiche, die wir bereits gesehen haben – sie erweitert den Umfang der betroffenen Datensätze durch Modifizieren der WHERE-Klausel, wie im folgenden Beispiel (wo der injizierte Teil fett gedruckt ist):
DELETE FROM wines WHERE sorte = ‚lagrein‘ OR 1=1;‘

2 Mehrere Abfrageinjektionen erhöhen den potenziellen Schaden, den ein Angreifer anrichten kann, indem mehrere destruktive Anweisungen in einer einzigen Abfrage enthalten sind. Bei Verwendung der MySQL-Datenbank kann ein Angreifer dies leicht erreichen, indem er ein unerwartetes Abschlusszeichen in die Abfrage einfügt – ein eingefügtes Anführungszeichen (einfach oder doppelt) markiert das Ende der erwarteten Variablen. Beenden Sie dann die Direktive mit einem Semikolon. Jetzt kann am Ende des nun beendeten ursprünglichen Befehls ein zusätzlicher Angriffsbefehl hinzugefügt werden. Die letzte destruktive Abfrage könnte wie folgt aussehen:

<code><span><span>SELECT</span> * <span>FROM</span> wines <span>WHERE</span> variety = <span>'lagrein'</span>;</span><span><span>GRANT</span><span>ALL</span><span>ON</span> *.* <span>TO</span><span>'BadGuy@%'</span> IDENTIFIED <span>BY</span><span>'gotcha'</span>;</span>' </code>
Nach dem Login kopieren
Diese Injektion erstellt einen neuen Benutzer BadGuy und erteilt ihm Netzwerkrechte (alle Rechte für alle Tabellen); außerdem wird ein „ominöses“ Passwort hinzugefügt diese einfache SELECT-Anweisung. Wenn Sie unserem Rat im vorherigen Artikel gefolgt sind und die Berechtigungen des Prozessbenutzers streng eingeschränkt haben, sollte dies nicht funktionieren, da der Webserver-Daemon nicht mehr über die von Ihnen entzogenen GRANT-Berechtigungen verfügt. Aber theoretisch könnte ein solcher Angriff BadGuy freie Hand geben, mit Ihrer Datenbank zu tun, was er will.

Die Schlussfolgerung, ob eine solche Mehrfachabfrage vom MySQL-Server verarbeitet wird, ist nicht eindeutig. Einiges davon kann auf unterschiedliche Versionen von MySQL zurückzuführen sein, meistens liegt es jedoch an der Art und Weise, wie mehrere Abfragen vorhanden sind. Das Überwachungsprogramm von MySQL lässt eine solche Abfrage vollständig zu. Die häufig verwendete MySQL-GUI phpMyAdmin kopiert alle vorherigen Inhalte vor der endgültigen Abfrage und führt nur dies aus.

Die meisten Mehrfachabfragen innerhalb eines Injektionskontexts werden jedoch von der MySQL-Erweiterung von PHP verwaltet. Glücklicherweise ist die Ausführung mehrerer Anweisungen in einer Abfrage standardmäßig nicht möglich; der Versuch, zwei Anweisungen auszuführen (wie die oben gezeigte Injektion), schlägt einfach fehl – ​​es werden keine Fehler gesetzt und es werden keine Ausgabeinformationen generiert. Obwohl PHP in diesem Fall sein Standardverhalten nur „regelmäßig“ implementiert, schützt es Sie vor den meisten einfachen Injektionsangriffen.
Die neue mysqli-Erweiterung in PHP5 (siehe http://php.net/mysqli) unterstützt wie mysql nicht von Natur aus mehrere Abfragen, bietet jedoch eine mysqli_multi_query()-Funktion, die Sie bei der Implementierung mehrerer Abfragen unterstützt – wenn Sie es wirklich möchten Mach das.
Noch schlimmer ist die Situation jedoch für SQLite – die einbettbare SQL-Datenbank-Engine, die mit PHP5 gebündelt ist (siehe http://sqlite.org/ und http://php.net/sqlite), die sich durch ihre Benutzerfreundlichkeit auszeichnet der Benutzeraufmerksamkeit. In einigen Fällen lässt SQLite solche Abfragen mit mehreren Anweisungen standardmäßig zu, da die Datenbank Batch-Abfragen optimieren kann, insbesondere die Batch-INSERT-Anweisungsverarbeitung, was sehr effizient ist. Die Funktion sqlite_query() erlaubt jedoch nicht die Ausführung mehrerer Abfragen, wenn die Ergebnisse der Abfrage von Ihrem Skript verwendet werden (z. B. im Fall der Verwendung einer SELECT-Anweisung zum Abrufen von Datensätzen). 3. INVISION Power BOARD SQL-Injection-Schwachstelle
Invision Power Board ist ein bekanntes Forensystem. Am 6. Mai 2005 wurde im Anmeldecode eine SQL-Injection-Sicherheitslücke entdeckt. Was es gefunden hat
Der Autor ist James Bercegay von GulfTech Security Research.
Diese Anmeldeabfrage sieht folgendermaßen aus:

<code><span>$DB</span>->query(<span>"SELECT * FROM ibf_members WHERE id=<span>$mid</span> AND password='<span>$pid</span>'"</span>); </code>
Nach dem Login kopieren

其中,成员ID变量midID

以上就介绍了PHP中SQL注入解析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage