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>
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>
其中,成员ID变量
以上就介绍了PHP中SQL注入解析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。