SCW图标
英雄背景无分隔线
博客

Programmierer erobern die Sicherheit: Teilen und Lernen - SQL Injection

Jaap Karan Singh
发表于 2018 年 12 月 06 日
最后更新于 2026年3月9日

Einfach ausgedrückt ist SQL (oder Structured Query Language) die Sprache, die für die Kommunikation mit relationalen Datenbanken verwendet wird; es ist die Abfragesprache, die von Entwicklern, Datenbankadministratoren und Anwendungen zur Verwaltung der täglich werden riesige Datenmengen generiert.

Unsere Daten werden schnell zu einem der wertvollsten Rohstoffe der Welt... und wenn etwas wertvoll ist, werden Bösewichte es zu ihrem Vorteil in die Hände bekommen wollen.

Angreifer verwenden SQL-Injection -- eine der ältesten (seit 1998!) und die lästigsten Datenlücken, die es gibt — zum Stehlen und Ändern vertraulicher Informationen, die in Millionen von Datenbanken auf der ganzen Welt verfügbar sind. Es ist heimtückisch, und Entwickler müssen verstehen, wie SQL-Injection funktioniert (und wie wir uns davor schützen können), wenn wir unsere Daten schützen wollen.

Zu diesem Zweck werden wir drei wichtige Aspekte der SQL-Injection erörtern:

  • 操作方法
  • Warum es so gefährlich ist
  • Wie kann man sich dagegen wehren

Verstehen Sie SQL Injection

SQL-Injection kann mit einem Wort verstanden werden: Kontext.

Innerhalb einer Anwendung gibt es zwei Kontexte: einen für Daten, den anderen für Code. Der Codekontext teilt dem Computer mit, was ausgeführt werden soll, und trennt ihn von den zu verarbeitenden Daten.

Eine SQL-Injection tritt auf, wenn ein Angreifer Daten eingibt, die vom SQL-Interpreter fälschlicherweise als Code behandelt werden.

Ein Beispiel ist ein Eingabefeld auf einer Website, in das ein Angreifer '“ OR 1=1" eingibt und es an das Ende einer SQL-Abfrage angehängt wird. Wenn diese Abfrage ausgeführt wird, gibt sie für jede Zeile in der Datenbank „true“ zurück. Das bedeutet, dass alle Datensätze aus der abgefragten Tabelle zurückgegeben werden.

Die Auswirkungen der SQL-Injection können katastrophal sein. Tritt dies auf einer Anmeldeseite auf, werden möglicherweise alle Benutzerdatensätze zurückgegeben, möglicherweise einschließlich Benutzernamen und Kennwörtern. Wenn eine einfache Abfrage zum Herausnehmen von Daten erfolgreich ist, gilt dies auch für Abfragen zum Ändern von Daten.

Schauen wir uns einen anfälligen Code an, damit Sie sehen können, wie eine SQL-Injection-Schwachstelle in der Natur aussieht.

Schau dir diesen Code an:

Zeichenkettenabfrage = „WÄHLEN SIE DEN KONTOSTAND VON user_data WHERE user_name =“
+ request.getParameter („Kundenname“);
versuche {
Anweisungsanweisung = Connection.createStatement (...);
ResultSet-Ergebnisse = Statement.executeQuery (Abfrage);
}

Der Code hier hängt einfach die Parameterinformationen vom Client ohne Validierung an das Ende der SQL-Abfrage an. In diesem Fall kann ein Angreifer Code in ein Eingabefeld oder URL-Parameter eingeben und dieser wird ausgeführt.

Das Wichtigste ist nicht, dass Angreifer jeder SELECT-Abfrage nur '“ OR 1=1" hinzufügen können, sondern dass ein Angreifer jede Art von SQL-Abfrage (INSERT, UPDATE, DELETE, DROP usw.) manipulieren und sie um alles erweitern kann, was die Datenbank unterstützt. Es gibt großartige Ressourcen und öffentlich verfügbare Tools, die zeigen, was möglich ist.

Wir werden bald lernen, wie wir dieses Problem beheben können. Lassen Sie uns zunächst verstehen, wie viel Schaden angerichtet werden kann.

Warum SQL Injection so gefährlich ist

Hier sind nur drei Beispiele für Sicherheitslücken, die durch SQL-Injection verursacht wurden:

  • Website des Wahlausschusses von Illinois wurde verletzt aufgrund von SQL-Injection-Schwachstellen. Die Angreifer stahlen die persönlichen Daten von 200.000 US-Bürgern. Aufgrund der Art der festgestellten Sicherheitslücke hätten die Angreifer die Daten ebenfalls ändern können, obwohl sie dies nicht getan haben.
  • Hetzner, ein südafrikanisches Website-Hosting-Unternehmen, wurde verletzt in Höhe von 40.000 Kundendatensätzen. Eine SQL-Injection-Schwachstelle führte zum möglichen Diebstahl aller Kundendatensätze in ihrer Datenbank.
  • Ein katholischer Finanzdienstleister in Minnesota, Vereinigte Staaten, wurde verletzt mit SQL Injection. Kontodaten, einschließlich Kontonummern, von fast 130.000 Kunden wurden gestohlen.

Sensible Daten können verwendet werden, um Konten zu übernehmen, Passwörter zurückzusetzen, Geld zu stehlen oder Betrug zu begehen.

Sogar Informationen, die nicht als sensibel oder persönlich identifizierbar gelten, können für andere Angriffe verwendet werden. Adressinformationen oder die letzten vier Ziffern Ihrer behördlichen Identifikationsnummer können verwendet werden, um sich bei Unternehmen als Sie auszugeben oder Ihr Passwort zurückzusetzen.

Wenn ein Angriff erfolgreich ist, können Kunden das Vertrauen in das Unternehmen verlieren. Die Wiederherstellung nach Systemschäden oder behördlichen Bußgeldern kann Millionen von Dollar kosten.

Aber für dich muss es nicht so enden.

Besiege SQL Injection

Die SQL-Injection kann verhindert werden, indem Teile Ihrer Anwendung eindeutig gekennzeichnet werden, sodass der Computer weiß, ob es sich bei einem bestimmten Teil um Daten oder Code handelt, der ausgeführt werden muss. Dies kann mithilfe parametrisierter Abfragen erfolgen.

Wenn SQL-Abfragen Parameter verwenden, verwendet der SQL-Interpreter die Parameter nur als Daten. Er führt ihn nicht als Code aus.

Beispielsweise funktioniert ein Angriff wie '“ OR 1=1" nicht. Die Datenbank sucht nach der Zeichenfolge „OR 1=1" und findet sie nicht in der Datenbank. Es zuckt einfach mit den Achseln und sagt: „Entschuldigung, ich kann das nicht für dich finden.“

Ein Beispiel für eine parametrisierte Abfrage in Java sieht so aus:

Die meisten Entwicklungsframeworks bieten integrierte Schutzmaßnahmen gegen SQL-Injection.

Objektrelationale Mapper (ORMs), wie Entitätsframework in der .NET-Familie parametrisiert Abfragen standardmäßig. Dadurch wird die SQL-Injektion erledigt, ohne dass Sie sich darum kümmern müssen.

Sie müssen jedoch wissen, wie Ihr spezielles ORM funktioniert. Zum Beispiel Überwintern, ein beliebtes ORM in der Java-Welt, kann immer noch verwundbar sein bei falscher Verwendung zur SQL-Injection.

Die Parametrisierung von Abfragen ist die erste und beste Verteidigung, aber es gibt noch andere. Gespeicherte Prozeduren unterstützen auch SQL-Parameter und können verwendet werden, um eine SQL-Injektion zu verhindern. Beachten Sie, dass die gespeicherten Prozeduren muss auch richtig gebaut werden damit das funktioniert.

//Das sollte auch WIRKLICH validiert werden
Zeichenfolge customname = request.getParameter („customerName“);
//Eingabevalidierung durchführen, um Angriffe zu erkennen
Zeichenkettenabfrage = „WÄHLEN SIE account_balance AUS user_data AUS WO user_name =? „;

PreparedStatement pstmt = Connection.PreparedStatement (Abfrage);
pstmt.setString (1, benutzerdefinierter Name);
ResultSet-Ergebnisse = pstmt.executeQuery ();

Validieren und desinfizieren Sie Ihre Eingaben immer. Da einige Zeichen, wie z. B. „OR 1=1", nicht von einem legitimen Benutzer Ihrer Anwendung eingegeben werden, müssen Sie sie nicht zulassen. Sie können dem Benutzer eine Fehlermeldung anzeigen oder sie aus Ihrer Eingabe entfernen, bevor Sie sie verarbeiten.

Verlassen Sie sich dabei nicht allein auf Validierung und Desinfektion, um sich zu schützen. Kluge Menschen haben Wege gefunden, das zu umgehen. Das sind gute Defense-in-Depth-Strategien (DiD), aber Parametrisierung ist der todsichere Weg, um alle Grundlagen abzudecken.

Eine weitere gute DiD-Strategie besteht darin, die „geringsten Rechte“ innerhalb der Datenbank zu verwenden und Eingaben auf die Whitelist zu setzen. Die Durchsetzung der geringsten Rechte bedeutet, dass Ihre Anwendung innerhalb der Datenbank nicht über unbegrenzte Funktionen verfügt. Sollte sich ein Angreifer Zugriff verschaffen, ist der Schaden, den er anrichten kann, begrenzt.

OWASP hat eine großartige Spickzettel für SQL-Injection verfügbar, um zu zeigen, wie man mit dieser Sicherheitslücke in mehreren Sprachen und Plattformen umgeht... aber wenn Sie noch einen Schritt weiter gehen möchten, können Sie jetzt auf unserer Plattform eine SQL Injection-Challenge in Ihrer bevorzugten Sprache spielen; hier sind einige der beliebtesten, um loszulegen:

SQL-Injektion in C#

SQL-Injektion in Node.js

SQL-Injektion in Python Django

SQL-Injektion in Java Spring

Die Reise beginnt

Sie haben große Fortschritte beim Verständnis von SQL Injection und den zur Behebung des Problems erforderlichen Schritte erzielt. Fantastisch!

Wir haben besprochen, wie eine SQL-Injection abläuft. In der Regel verwendet ein Angreifer Eingaben, um Ihre Datenbankabfragen für seine eigenen schändlichen Zwecke zu steuern.

Wir haben auch den Schaden gesehen, der durch die Ausnutzung von SQL-Injection-Schwachstellen verursacht wird: Konten können kompromittiert werden und Millionen von Dollar verloren gehen... ein Albtraum und noch dazu ein teurer.

Wir haben gesehen, wie eine SQL-Injektion verhindert werden kann:

  • Parametrisierung von Abfragen
  • Verwenden objektrelationaler Mapper und gespeicherter Prozeduren
  • Benutzereingaben validieren und auf die Whitelist setzen

Jetzt liegt es an dir. Üben ist der beste Weg, um weiter zu lernen und sich weiterzuentwickeln. Schauen Sie sich doch unsere an Ressourcen zum Lernen auf SQL Injection, dann probiere unsere kostenlose Demo von der Plattform? Du bist auf dem besten Weg, ein Secure Code Warrior zu werden.

查看资源
查看资源

Angreifer verwenden SQL Injection — eine der ältesten (seit 1998!) und die lästigsten Datenlücken, die es gibt — um vertrauliche Informationen zu stehlen und zu verändern, die in Millionen von Datenbanken auf der ganzen Welt verfügbar sind.

想了解更多吗?

Jaap Karan Singh ist Secure Coding Evangelist, Chief Singh und Mitbegründer von Secure Code Warrior.

了解更多

Secure Code Warrior 您的Secure Code Warrior 帮助您在整个软件开发周期中保障代码安全,并建立将网络安全置于首位的企业文化。无论您是应用安全经理、开发人员、首席信息安全官,还是其他从事安全工作的人员,我们都能协助您的企业降低不安全代码带来的风险。

预约演示
分享到:
领英品牌社交x 标志
作者
Jaap Karan Singh
发表于2018年12月06日

Jaap Karan Singh ist Secure Coding Evangelist, Chief Singh und Mitbegründer von Secure Code Warrior.

分享到:
领英品牌社交x 标志

Einfach ausgedrückt ist SQL (oder Structured Query Language) die Sprache, die für die Kommunikation mit relationalen Datenbanken verwendet wird; es ist die Abfragesprache, die von Entwicklern, Datenbankadministratoren und Anwendungen zur Verwaltung der täglich werden riesige Datenmengen generiert.

Unsere Daten werden schnell zu einem der wertvollsten Rohstoffe der Welt... und wenn etwas wertvoll ist, werden Bösewichte es zu ihrem Vorteil in die Hände bekommen wollen.

Angreifer verwenden SQL-Injection -- eine der ältesten (seit 1998!) und die lästigsten Datenlücken, die es gibt — zum Stehlen und Ändern vertraulicher Informationen, die in Millionen von Datenbanken auf der ganzen Welt verfügbar sind. Es ist heimtückisch, und Entwickler müssen verstehen, wie SQL-Injection funktioniert (und wie wir uns davor schützen können), wenn wir unsere Daten schützen wollen.

Zu diesem Zweck werden wir drei wichtige Aspekte der SQL-Injection erörtern:

  • 操作方法
  • Warum es so gefährlich ist
  • Wie kann man sich dagegen wehren

Verstehen Sie SQL Injection

SQL-Injection kann mit einem Wort verstanden werden: Kontext.

Innerhalb einer Anwendung gibt es zwei Kontexte: einen für Daten, den anderen für Code. Der Codekontext teilt dem Computer mit, was ausgeführt werden soll, und trennt ihn von den zu verarbeitenden Daten.

Eine SQL-Injection tritt auf, wenn ein Angreifer Daten eingibt, die vom SQL-Interpreter fälschlicherweise als Code behandelt werden.

Ein Beispiel ist ein Eingabefeld auf einer Website, in das ein Angreifer '“ OR 1=1" eingibt und es an das Ende einer SQL-Abfrage angehängt wird. Wenn diese Abfrage ausgeführt wird, gibt sie für jede Zeile in der Datenbank „true“ zurück. Das bedeutet, dass alle Datensätze aus der abgefragten Tabelle zurückgegeben werden.

Die Auswirkungen der SQL-Injection können katastrophal sein. Tritt dies auf einer Anmeldeseite auf, werden möglicherweise alle Benutzerdatensätze zurückgegeben, möglicherweise einschließlich Benutzernamen und Kennwörtern. Wenn eine einfache Abfrage zum Herausnehmen von Daten erfolgreich ist, gilt dies auch für Abfragen zum Ändern von Daten.

Schauen wir uns einen anfälligen Code an, damit Sie sehen können, wie eine SQL-Injection-Schwachstelle in der Natur aussieht.

Schau dir diesen Code an:

Zeichenkettenabfrage = „WÄHLEN SIE DEN KONTOSTAND VON user_data WHERE user_name =“
+ request.getParameter („Kundenname“);
versuche {
Anweisungsanweisung = Connection.createStatement (...);
ResultSet-Ergebnisse = Statement.executeQuery (Abfrage);
}

Der Code hier hängt einfach die Parameterinformationen vom Client ohne Validierung an das Ende der SQL-Abfrage an. In diesem Fall kann ein Angreifer Code in ein Eingabefeld oder URL-Parameter eingeben und dieser wird ausgeführt.

Das Wichtigste ist nicht, dass Angreifer jeder SELECT-Abfrage nur '“ OR 1=1" hinzufügen können, sondern dass ein Angreifer jede Art von SQL-Abfrage (INSERT, UPDATE, DELETE, DROP usw.) manipulieren und sie um alles erweitern kann, was die Datenbank unterstützt. Es gibt großartige Ressourcen und öffentlich verfügbare Tools, die zeigen, was möglich ist.

Wir werden bald lernen, wie wir dieses Problem beheben können. Lassen Sie uns zunächst verstehen, wie viel Schaden angerichtet werden kann.

Warum SQL Injection so gefährlich ist

Hier sind nur drei Beispiele für Sicherheitslücken, die durch SQL-Injection verursacht wurden:

  • Website des Wahlausschusses von Illinois wurde verletzt aufgrund von SQL-Injection-Schwachstellen. Die Angreifer stahlen die persönlichen Daten von 200.000 US-Bürgern. Aufgrund der Art der festgestellten Sicherheitslücke hätten die Angreifer die Daten ebenfalls ändern können, obwohl sie dies nicht getan haben.
  • Hetzner, ein südafrikanisches Website-Hosting-Unternehmen, wurde verletzt in Höhe von 40.000 Kundendatensätzen. Eine SQL-Injection-Schwachstelle führte zum möglichen Diebstahl aller Kundendatensätze in ihrer Datenbank.
  • Ein katholischer Finanzdienstleister in Minnesota, Vereinigte Staaten, wurde verletzt mit SQL Injection. Kontodaten, einschließlich Kontonummern, von fast 130.000 Kunden wurden gestohlen.

Sensible Daten können verwendet werden, um Konten zu übernehmen, Passwörter zurückzusetzen, Geld zu stehlen oder Betrug zu begehen.

Sogar Informationen, die nicht als sensibel oder persönlich identifizierbar gelten, können für andere Angriffe verwendet werden. Adressinformationen oder die letzten vier Ziffern Ihrer behördlichen Identifikationsnummer können verwendet werden, um sich bei Unternehmen als Sie auszugeben oder Ihr Passwort zurückzusetzen.

Wenn ein Angriff erfolgreich ist, können Kunden das Vertrauen in das Unternehmen verlieren. Die Wiederherstellung nach Systemschäden oder behördlichen Bußgeldern kann Millionen von Dollar kosten.

Aber für dich muss es nicht so enden.

Besiege SQL Injection

Die SQL-Injection kann verhindert werden, indem Teile Ihrer Anwendung eindeutig gekennzeichnet werden, sodass der Computer weiß, ob es sich bei einem bestimmten Teil um Daten oder Code handelt, der ausgeführt werden muss. Dies kann mithilfe parametrisierter Abfragen erfolgen.

Wenn SQL-Abfragen Parameter verwenden, verwendet der SQL-Interpreter die Parameter nur als Daten. Er führt ihn nicht als Code aus.

Beispielsweise funktioniert ein Angriff wie '“ OR 1=1" nicht. Die Datenbank sucht nach der Zeichenfolge „OR 1=1" und findet sie nicht in der Datenbank. Es zuckt einfach mit den Achseln und sagt: „Entschuldigung, ich kann das nicht für dich finden.“

Ein Beispiel für eine parametrisierte Abfrage in Java sieht so aus:

Die meisten Entwicklungsframeworks bieten integrierte Schutzmaßnahmen gegen SQL-Injection.

Objektrelationale Mapper (ORMs), wie Entitätsframework in der .NET-Familie parametrisiert Abfragen standardmäßig. Dadurch wird die SQL-Injektion erledigt, ohne dass Sie sich darum kümmern müssen.

Sie müssen jedoch wissen, wie Ihr spezielles ORM funktioniert. Zum Beispiel Überwintern, ein beliebtes ORM in der Java-Welt, kann immer noch verwundbar sein bei falscher Verwendung zur SQL-Injection.

Die Parametrisierung von Abfragen ist die erste und beste Verteidigung, aber es gibt noch andere. Gespeicherte Prozeduren unterstützen auch SQL-Parameter und können verwendet werden, um eine SQL-Injektion zu verhindern. Beachten Sie, dass die gespeicherten Prozeduren muss auch richtig gebaut werden damit das funktioniert.

//Das sollte auch WIRKLICH validiert werden
Zeichenfolge customname = request.getParameter („customerName“);
//Eingabevalidierung durchführen, um Angriffe zu erkennen
Zeichenkettenabfrage = „WÄHLEN SIE account_balance AUS user_data AUS WO user_name =? „;

PreparedStatement pstmt = Connection.PreparedStatement (Abfrage);
pstmt.setString (1, benutzerdefinierter Name);
ResultSet-Ergebnisse = pstmt.executeQuery ();

Validieren und desinfizieren Sie Ihre Eingaben immer. Da einige Zeichen, wie z. B. „OR 1=1", nicht von einem legitimen Benutzer Ihrer Anwendung eingegeben werden, müssen Sie sie nicht zulassen. Sie können dem Benutzer eine Fehlermeldung anzeigen oder sie aus Ihrer Eingabe entfernen, bevor Sie sie verarbeiten.

Verlassen Sie sich dabei nicht allein auf Validierung und Desinfektion, um sich zu schützen. Kluge Menschen haben Wege gefunden, das zu umgehen. Das sind gute Defense-in-Depth-Strategien (DiD), aber Parametrisierung ist der todsichere Weg, um alle Grundlagen abzudecken.

Eine weitere gute DiD-Strategie besteht darin, die „geringsten Rechte“ innerhalb der Datenbank zu verwenden und Eingaben auf die Whitelist zu setzen. Die Durchsetzung der geringsten Rechte bedeutet, dass Ihre Anwendung innerhalb der Datenbank nicht über unbegrenzte Funktionen verfügt. Sollte sich ein Angreifer Zugriff verschaffen, ist der Schaden, den er anrichten kann, begrenzt.

OWASP hat eine großartige Spickzettel für SQL-Injection verfügbar, um zu zeigen, wie man mit dieser Sicherheitslücke in mehreren Sprachen und Plattformen umgeht... aber wenn Sie noch einen Schritt weiter gehen möchten, können Sie jetzt auf unserer Plattform eine SQL Injection-Challenge in Ihrer bevorzugten Sprache spielen; hier sind einige der beliebtesten, um loszulegen:

SQL-Injektion in C#

SQL-Injektion in Node.js

SQL-Injektion in Python Django

SQL-Injektion in Java Spring

Die Reise beginnt

Sie haben große Fortschritte beim Verständnis von SQL Injection und den zur Behebung des Problems erforderlichen Schritte erzielt. Fantastisch!

Wir haben besprochen, wie eine SQL-Injection abläuft. In der Regel verwendet ein Angreifer Eingaben, um Ihre Datenbankabfragen für seine eigenen schändlichen Zwecke zu steuern.

Wir haben auch den Schaden gesehen, der durch die Ausnutzung von SQL-Injection-Schwachstellen verursacht wird: Konten können kompromittiert werden und Millionen von Dollar verloren gehen... ein Albtraum und noch dazu ein teurer.

Wir haben gesehen, wie eine SQL-Injektion verhindert werden kann:

  • Parametrisierung von Abfragen
  • Verwenden objektrelationaler Mapper und gespeicherter Prozeduren
  • Benutzereingaben validieren und auf die Whitelist setzen

Jetzt liegt es an dir. Üben ist der beste Weg, um weiter zu lernen und sich weiterzuentwickeln. Schauen Sie sich doch unsere an Ressourcen zum Lernen auf SQL Injection, dann probiere unsere kostenlose Demo von der Plattform? Du bist auf dem besten Weg, ein Secure Code Warrior zu werden.

查看资源
查看资源

请填写下方表格以下载报告

我们恳请您允许我们向您发送有关我们产品及/或安全编码相关主题的信息。我们将始终以最高标准谨慎处理您的个人数据,绝不会为营销目的将其出售给其他企业。

提交
scw 成功图标
SCW 错误图标
要提交表单,请启用“Analytics”Cookie。完成后,您可随时将其关闭。

Einfach ausgedrückt ist SQL (oder Structured Query Language) die Sprache, die für die Kommunikation mit relationalen Datenbanken verwendet wird; es ist die Abfragesprache, die von Entwicklern, Datenbankadministratoren und Anwendungen zur Verwaltung der täglich werden riesige Datenmengen generiert.

Unsere Daten werden schnell zu einem der wertvollsten Rohstoffe der Welt... und wenn etwas wertvoll ist, werden Bösewichte es zu ihrem Vorteil in die Hände bekommen wollen.

Angreifer verwenden SQL-Injection -- eine der ältesten (seit 1998!) und die lästigsten Datenlücken, die es gibt — zum Stehlen und Ändern vertraulicher Informationen, die in Millionen von Datenbanken auf der ganzen Welt verfügbar sind. Es ist heimtückisch, und Entwickler müssen verstehen, wie SQL-Injection funktioniert (und wie wir uns davor schützen können), wenn wir unsere Daten schützen wollen.

Zu diesem Zweck werden wir drei wichtige Aspekte der SQL-Injection erörtern:

  • 操作方法
  • Warum es so gefährlich ist
  • Wie kann man sich dagegen wehren

Verstehen Sie SQL Injection

SQL-Injection kann mit einem Wort verstanden werden: Kontext.

Innerhalb einer Anwendung gibt es zwei Kontexte: einen für Daten, den anderen für Code. Der Codekontext teilt dem Computer mit, was ausgeführt werden soll, und trennt ihn von den zu verarbeitenden Daten.

Eine SQL-Injection tritt auf, wenn ein Angreifer Daten eingibt, die vom SQL-Interpreter fälschlicherweise als Code behandelt werden.

Ein Beispiel ist ein Eingabefeld auf einer Website, in das ein Angreifer '“ OR 1=1" eingibt und es an das Ende einer SQL-Abfrage angehängt wird. Wenn diese Abfrage ausgeführt wird, gibt sie für jede Zeile in der Datenbank „true“ zurück. Das bedeutet, dass alle Datensätze aus der abgefragten Tabelle zurückgegeben werden.

Die Auswirkungen der SQL-Injection können katastrophal sein. Tritt dies auf einer Anmeldeseite auf, werden möglicherweise alle Benutzerdatensätze zurückgegeben, möglicherweise einschließlich Benutzernamen und Kennwörtern. Wenn eine einfache Abfrage zum Herausnehmen von Daten erfolgreich ist, gilt dies auch für Abfragen zum Ändern von Daten.

Schauen wir uns einen anfälligen Code an, damit Sie sehen können, wie eine SQL-Injection-Schwachstelle in der Natur aussieht.

Schau dir diesen Code an:

Zeichenkettenabfrage = „WÄHLEN SIE DEN KONTOSTAND VON user_data WHERE user_name =“
+ request.getParameter („Kundenname“);
versuche {
Anweisungsanweisung = Connection.createStatement (...);
ResultSet-Ergebnisse = Statement.executeQuery (Abfrage);
}

Der Code hier hängt einfach die Parameterinformationen vom Client ohne Validierung an das Ende der SQL-Abfrage an. In diesem Fall kann ein Angreifer Code in ein Eingabefeld oder URL-Parameter eingeben und dieser wird ausgeführt.

Das Wichtigste ist nicht, dass Angreifer jeder SELECT-Abfrage nur '“ OR 1=1" hinzufügen können, sondern dass ein Angreifer jede Art von SQL-Abfrage (INSERT, UPDATE, DELETE, DROP usw.) manipulieren und sie um alles erweitern kann, was die Datenbank unterstützt. Es gibt großartige Ressourcen und öffentlich verfügbare Tools, die zeigen, was möglich ist.

Wir werden bald lernen, wie wir dieses Problem beheben können. Lassen Sie uns zunächst verstehen, wie viel Schaden angerichtet werden kann.

Warum SQL Injection so gefährlich ist

Hier sind nur drei Beispiele für Sicherheitslücken, die durch SQL-Injection verursacht wurden:

  • Website des Wahlausschusses von Illinois wurde verletzt aufgrund von SQL-Injection-Schwachstellen. Die Angreifer stahlen die persönlichen Daten von 200.000 US-Bürgern. Aufgrund der Art der festgestellten Sicherheitslücke hätten die Angreifer die Daten ebenfalls ändern können, obwohl sie dies nicht getan haben.
  • Hetzner, ein südafrikanisches Website-Hosting-Unternehmen, wurde verletzt in Höhe von 40.000 Kundendatensätzen. Eine SQL-Injection-Schwachstelle führte zum möglichen Diebstahl aller Kundendatensätze in ihrer Datenbank.
  • Ein katholischer Finanzdienstleister in Minnesota, Vereinigte Staaten, wurde verletzt mit SQL Injection. Kontodaten, einschließlich Kontonummern, von fast 130.000 Kunden wurden gestohlen.

Sensible Daten können verwendet werden, um Konten zu übernehmen, Passwörter zurückzusetzen, Geld zu stehlen oder Betrug zu begehen.

Sogar Informationen, die nicht als sensibel oder persönlich identifizierbar gelten, können für andere Angriffe verwendet werden. Adressinformationen oder die letzten vier Ziffern Ihrer behördlichen Identifikationsnummer können verwendet werden, um sich bei Unternehmen als Sie auszugeben oder Ihr Passwort zurückzusetzen.

Wenn ein Angriff erfolgreich ist, können Kunden das Vertrauen in das Unternehmen verlieren. Die Wiederherstellung nach Systemschäden oder behördlichen Bußgeldern kann Millionen von Dollar kosten.

Aber für dich muss es nicht so enden.

Besiege SQL Injection

Die SQL-Injection kann verhindert werden, indem Teile Ihrer Anwendung eindeutig gekennzeichnet werden, sodass der Computer weiß, ob es sich bei einem bestimmten Teil um Daten oder Code handelt, der ausgeführt werden muss. Dies kann mithilfe parametrisierter Abfragen erfolgen.

Wenn SQL-Abfragen Parameter verwenden, verwendet der SQL-Interpreter die Parameter nur als Daten. Er führt ihn nicht als Code aus.

Beispielsweise funktioniert ein Angriff wie '“ OR 1=1" nicht. Die Datenbank sucht nach der Zeichenfolge „OR 1=1" und findet sie nicht in der Datenbank. Es zuckt einfach mit den Achseln und sagt: „Entschuldigung, ich kann das nicht für dich finden.“

Ein Beispiel für eine parametrisierte Abfrage in Java sieht so aus:

Die meisten Entwicklungsframeworks bieten integrierte Schutzmaßnahmen gegen SQL-Injection.

Objektrelationale Mapper (ORMs), wie Entitätsframework in der .NET-Familie parametrisiert Abfragen standardmäßig. Dadurch wird die SQL-Injektion erledigt, ohne dass Sie sich darum kümmern müssen.

Sie müssen jedoch wissen, wie Ihr spezielles ORM funktioniert. Zum Beispiel Überwintern, ein beliebtes ORM in der Java-Welt, kann immer noch verwundbar sein bei falscher Verwendung zur SQL-Injection.

Die Parametrisierung von Abfragen ist die erste und beste Verteidigung, aber es gibt noch andere. Gespeicherte Prozeduren unterstützen auch SQL-Parameter und können verwendet werden, um eine SQL-Injektion zu verhindern. Beachten Sie, dass die gespeicherten Prozeduren muss auch richtig gebaut werden damit das funktioniert.

//Das sollte auch WIRKLICH validiert werden
Zeichenfolge customname = request.getParameter („customerName“);
//Eingabevalidierung durchführen, um Angriffe zu erkennen
Zeichenkettenabfrage = „WÄHLEN SIE account_balance AUS user_data AUS WO user_name =? „;

PreparedStatement pstmt = Connection.PreparedStatement (Abfrage);
pstmt.setString (1, benutzerdefinierter Name);
ResultSet-Ergebnisse = pstmt.executeQuery ();

Validieren und desinfizieren Sie Ihre Eingaben immer. Da einige Zeichen, wie z. B. „OR 1=1", nicht von einem legitimen Benutzer Ihrer Anwendung eingegeben werden, müssen Sie sie nicht zulassen. Sie können dem Benutzer eine Fehlermeldung anzeigen oder sie aus Ihrer Eingabe entfernen, bevor Sie sie verarbeiten.

Verlassen Sie sich dabei nicht allein auf Validierung und Desinfektion, um sich zu schützen. Kluge Menschen haben Wege gefunden, das zu umgehen. Das sind gute Defense-in-Depth-Strategien (DiD), aber Parametrisierung ist der todsichere Weg, um alle Grundlagen abzudecken.

Eine weitere gute DiD-Strategie besteht darin, die „geringsten Rechte“ innerhalb der Datenbank zu verwenden und Eingaben auf die Whitelist zu setzen. Die Durchsetzung der geringsten Rechte bedeutet, dass Ihre Anwendung innerhalb der Datenbank nicht über unbegrenzte Funktionen verfügt. Sollte sich ein Angreifer Zugriff verschaffen, ist der Schaden, den er anrichten kann, begrenzt.

OWASP hat eine großartige Spickzettel für SQL-Injection verfügbar, um zu zeigen, wie man mit dieser Sicherheitslücke in mehreren Sprachen und Plattformen umgeht... aber wenn Sie noch einen Schritt weiter gehen möchten, können Sie jetzt auf unserer Plattform eine SQL Injection-Challenge in Ihrer bevorzugten Sprache spielen; hier sind einige der beliebtesten, um loszulegen:

SQL-Injektion in C#

SQL-Injektion in Node.js

SQL-Injektion in Python Django

SQL-Injektion in Java Spring

Die Reise beginnt

Sie haben große Fortschritte beim Verständnis von SQL Injection und den zur Behebung des Problems erforderlichen Schritte erzielt. Fantastisch!

Wir haben besprochen, wie eine SQL-Injection abläuft. In der Regel verwendet ein Angreifer Eingaben, um Ihre Datenbankabfragen für seine eigenen schändlichen Zwecke zu steuern.

Wir haben auch den Schaden gesehen, der durch die Ausnutzung von SQL-Injection-Schwachstellen verursacht wird: Konten können kompromittiert werden und Millionen von Dollar verloren gehen... ein Albtraum und noch dazu ein teurer.

Wir haben gesehen, wie eine SQL-Injektion verhindert werden kann:

  • Parametrisierung von Abfragen
  • Verwenden objektrelationaler Mapper und gespeicherter Prozeduren
  • Benutzereingaben validieren und auf die Whitelist setzen

Jetzt liegt es an dir. Üben ist der beste Weg, um weiter zu lernen und sich weiterzuentwickeln. Schauen Sie sich doch unsere an Ressourcen zum Lernen auf SQL Injection, dann probiere unsere kostenlose Demo von der Plattform? Du bist auf dem besten Weg, ein Secure Code Warrior zu werden.

观看网络研讨会
开始吧
了解更多

请点击下方链接下载该资源的PDF文件。

Secure Code Warrior 您的Secure Code Warrior 帮助您在整个软件开发周期中保障代码安全,并建立将网络安全置于首位的企业文化。无论您是应用安全经理、开发人员、首席信息安全官,还是其他从事安全工作的人员,我们都能协助您的企业降低不安全代码带来的风险。

查看报告预约演示
下载PDF文件
查看资源
分享到:
领英品牌社交x 标志
想了解更多吗?

分享到:
领英品牌社交x 标志
作者
Jaap Karan Singh
发表于2018年12月06日

Jaap Karan Singh ist Secure Coding Evangelist, Chief Singh und Mitbegründer von Secure Code Warrior.

分享到:
领英品牌社交x 标志

Einfach ausgedrückt ist SQL (oder Structured Query Language) die Sprache, die für die Kommunikation mit relationalen Datenbanken verwendet wird; es ist die Abfragesprache, die von Entwicklern, Datenbankadministratoren und Anwendungen zur Verwaltung der täglich werden riesige Datenmengen generiert.

Unsere Daten werden schnell zu einem der wertvollsten Rohstoffe der Welt... und wenn etwas wertvoll ist, werden Bösewichte es zu ihrem Vorteil in die Hände bekommen wollen.

Angreifer verwenden SQL-Injection -- eine der ältesten (seit 1998!) und die lästigsten Datenlücken, die es gibt — zum Stehlen und Ändern vertraulicher Informationen, die in Millionen von Datenbanken auf der ganzen Welt verfügbar sind. Es ist heimtückisch, und Entwickler müssen verstehen, wie SQL-Injection funktioniert (und wie wir uns davor schützen können), wenn wir unsere Daten schützen wollen.

Zu diesem Zweck werden wir drei wichtige Aspekte der SQL-Injection erörtern:

  • 操作方法
  • Warum es so gefährlich ist
  • Wie kann man sich dagegen wehren

Verstehen Sie SQL Injection

SQL-Injection kann mit einem Wort verstanden werden: Kontext.

Innerhalb einer Anwendung gibt es zwei Kontexte: einen für Daten, den anderen für Code. Der Codekontext teilt dem Computer mit, was ausgeführt werden soll, und trennt ihn von den zu verarbeitenden Daten.

Eine SQL-Injection tritt auf, wenn ein Angreifer Daten eingibt, die vom SQL-Interpreter fälschlicherweise als Code behandelt werden.

Ein Beispiel ist ein Eingabefeld auf einer Website, in das ein Angreifer '“ OR 1=1" eingibt und es an das Ende einer SQL-Abfrage angehängt wird. Wenn diese Abfrage ausgeführt wird, gibt sie für jede Zeile in der Datenbank „true“ zurück. Das bedeutet, dass alle Datensätze aus der abgefragten Tabelle zurückgegeben werden.

Die Auswirkungen der SQL-Injection können katastrophal sein. Tritt dies auf einer Anmeldeseite auf, werden möglicherweise alle Benutzerdatensätze zurückgegeben, möglicherweise einschließlich Benutzernamen und Kennwörtern. Wenn eine einfache Abfrage zum Herausnehmen von Daten erfolgreich ist, gilt dies auch für Abfragen zum Ändern von Daten.

Schauen wir uns einen anfälligen Code an, damit Sie sehen können, wie eine SQL-Injection-Schwachstelle in der Natur aussieht.

Schau dir diesen Code an:

Zeichenkettenabfrage = „WÄHLEN SIE DEN KONTOSTAND VON user_data WHERE user_name =“
+ request.getParameter („Kundenname“);
versuche {
Anweisungsanweisung = Connection.createStatement (...);
ResultSet-Ergebnisse = Statement.executeQuery (Abfrage);
}

Der Code hier hängt einfach die Parameterinformationen vom Client ohne Validierung an das Ende der SQL-Abfrage an. In diesem Fall kann ein Angreifer Code in ein Eingabefeld oder URL-Parameter eingeben und dieser wird ausgeführt.

Das Wichtigste ist nicht, dass Angreifer jeder SELECT-Abfrage nur '“ OR 1=1" hinzufügen können, sondern dass ein Angreifer jede Art von SQL-Abfrage (INSERT, UPDATE, DELETE, DROP usw.) manipulieren und sie um alles erweitern kann, was die Datenbank unterstützt. Es gibt großartige Ressourcen und öffentlich verfügbare Tools, die zeigen, was möglich ist.

Wir werden bald lernen, wie wir dieses Problem beheben können. Lassen Sie uns zunächst verstehen, wie viel Schaden angerichtet werden kann.

Warum SQL Injection so gefährlich ist

Hier sind nur drei Beispiele für Sicherheitslücken, die durch SQL-Injection verursacht wurden:

  • Website des Wahlausschusses von Illinois wurde verletzt aufgrund von SQL-Injection-Schwachstellen. Die Angreifer stahlen die persönlichen Daten von 200.000 US-Bürgern. Aufgrund der Art der festgestellten Sicherheitslücke hätten die Angreifer die Daten ebenfalls ändern können, obwohl sie dies nicht getan haben.
  • Hetzner, ein südafrikanisches Website-Hosting-Unternehmen, wurde verletzt in Höhe von 40.000 Kundendatensätzen. Eine SQL-Injection-Schwachstelle führte zum möglichen Diebstahl aller Kundendatensätze in ihrer Datenbank.
  • Ein katholischer Finanzdienstleister in Minnesota, Vereinigte Staaten, wurde verletzt mit SQL Injection. Kontodaten, einschließlich Kontonummern, von fast 130.000 Kunden wurden gestohlen.

Sensible Daten können verwendet werden, um Konten zu übernehmen, Passwörter zurückzusetzen, Geld zu stehlen oder Betrug zu begehen.

Sogar Informationen, die nicht als sensibel oder persönlich identifizierbar gelten, können für andere Angriffe verwendet werden. Adressinformationen oder die letzten vier Ziffern Ihrer behördlichen Identifikationsnummer können verwendet werden, um sich bei Unternehmen als Sie auszugeben oder Ihr Passwort zurückzusetzen.

Wenn ein Angriff erfolgreich ist, können Kunden das Vertrauen in das Unternehmen verlieren. Die Wiederherstellung nach Systemschäden oder behördlichen Bußgeldern kann Millionen von Dollar kosten.

Aber für dich muss es nicht so enden.

Besiege SQL Injection

Die SQL-Injection kann verhindert werden, indem Teile Ihrer Anwendung eindeutig gekennzeichnet werden, sodass der Computer weiß, ob es sich bei einem bestimmten Teil um Daten oder Code handelt, der ausgeführt werden muss. Dies kann mithilfe parametrisierter Abfragen erfolgen.

Wenn SQL-Abfragen Parameter verwenden, verwendet der SQL-Interpreter die Parameter nur als Daten. Er führt ihn nicht als Code aus.

Beispielsweise funktioniert ein Angriff wie '“ OR 1=1" nicht. Die Datenbank sucht nach der Zeichenfolge „OR 1=1" und findet sie nicht in der Datenbank. Es zuckt einfach mit den Achseln und sagt: „Entschuldigung, ich kann das nicht für dich finden.“

Ein Beispiel für eine parametrisierte Abfrage in Java sieht so aus:

Die meisten Entwicklungsframeworks bieten integrierte Schutzmaßnahmen gegen SQL-Injection.

Objektrelationale Mapper (ORMs), wie Entitätsframework in der .NET-Familie parametrisiert Abfragen standardmäßig. Dadurch wird die SQL-Injektion erledigt, ohne dass Sie sich darum kümmern müssen.

Sie müssen jedoch wissen, wie Ihr spezielles ORM funktioniert. Zum Beispiel Überwintern, ein beliebtes ORM in der Java-Welt, kann immer noch verwundbar sein bei falscher Verwendung zur SQL-Injection.

Die Parametrisierung von Abfragen ist die erste und beste Verteidigung, aber es gibt noch andere. Gespeicherte Prozeduren unterstützen auch SQL-Parameter und können verwendet werden, um eine SQL-Injektion zu verhindern. Beachten Sie, dass die gespeicherten Prozeduren muss auch richtig gebaut werden damit das funktioniert.

//Das sollte auch WIRKLICH validiert werden
Zeichenfolge customname = request.getParameter („customerName“);
//Eingabevalidierung durchführen, um Angriffe zu erkennen
Zeichenkettenabfrage = „WÄHLEN SIE account_balance AUS user_data AUS WO user_name =? „;

PreparedStatement pstmt = Connection.PreparedStatement (Abfrage);
pstmt.setString (1, benutzerdefinierter Name);
ResultSet-Ergebnisse = pstmt.executeQuery ();

Validieren und desinfizieren Sie Ihre Eingaben immer. Da einige Zeichen, wie z. B. „OR 1=1", nicht von einem legitimen Benutzer Ihrer Anwendung eingegeben werden, müssen Sie sie nicht zulassen. Sie können dem Benutzer eine Fehlermeldung anzeigen oder sie aus Ihrer Eingabe entfernen, bevor Sie sie verarbeiten.

Verlassen Sie sich dabei nicht allein auf Validierung und Desinfektion, um sich zu schützen. Kluge Menschen haben Wege gefunden, das zu umgehen. Das sind gute Defense-in-Depth-Strategien (DiD), aber Parametrisierung ist der todsichere Weg, um alle Grundlagen abzudecken.

Eine weitere gute DiD-Strategie besteht darin, die „geringsten Rechte“ innerhalb der Datenbank zu verwenden und Eingaben auf die Whitelist zu setzen. Die Durchsetzung der geringsten Rechte bedeutet, dass Ihre Anwendung innerhalb der Datenbank nicht über unbegrenzte Funktionen verfügt. Sollte sich ein Angreifer Zugriff verschaffen, ist der Schaden, den er anrichten kann, begrenzt.

OWASP hat eine großartige Spickzettel für SQL-Injection verfügbar, um zu zeigen, wie man mit dieser Sicherheitslücke in mehreren Sprachen und Plattformen umgeht... aber wenn Sie noch einen Schritt weiter gehen möchten, können Sie jetzt auf unserer Plattform eine SQL Injection-Challenge in Ihrer bevorzugten Sprache spielen; hier sind einige der beliebtesten, um loszulegen:

SQL-Injektion in C#

SQL-Injektion in Node.js

SQL-Injektion in Python Django

SQL-Injektion in Java Spring

Die Reise beginnt

Sie haben große Fortschritte beim Verständnis von SQL Injection und den zur Behebung des Problems erforderlichen Schritte erzielt. Fantastisch!

Wir haben besprochen, wie eine SQL-Injection abläuft. In der Regel verwendet ein Angreifer Eingaben, um Ihre Datenbankabfragen für seine eigenen schändlichen Zwecke zu steuern.

Wir haben auch den Schaden gesehen, der durch die Ausnutzung von SQL-Injection-Schwachstellen verursacht wird: Konten können kompromittiert werden und Millionen von Dollar verloren gehen... ein Albtraum und noch dazu ein teurer.

Wir haben gesehen, wie eine SQL-Injektion verhindert werden kann:

  • Parametrisierung von Abfragen
  • Verwenden objektrelationaler Mapper und gespeicherter Prozeduren
  • Benutzereingaben validieren und auf die Whitelist setzen

Jetzt liegt es an dir. Üben ist der beste Weg, um weiter zu lernen und sich weiterzuentwickeln. Schauen Sie sich doch unsere an Ressourcen zum Lernen auf SQL Injection, dann probiere unsere kostenlose Demo von der Plattform? Du bist auf dem besten Weg, ein Secure Code Warrior zu werden.

目录

下载PDF文件
查看资源
想了解更多吗?

Jaap Karan Singh ist Secure Coding Evangelist, Chief Singh und Mitbegründer von Secure Code Warrior.

了解更多

Secure Code Warrior 您的Secure Code Warrior 帮助您在整个软件开发周期中保障代码安全,并建立将网络安全置于首位的企业文化。无论您是应用安全经理、开发人员、首席信息安全官,还是其他从事安全工作的人员,我们都能协助您的企业降低不安全代码带来的风险。

预约演示下载
分享到:
领英品牌社交x 标志
资源中心

入门资源

更多文章
资源中心

入门资源

更多文章