SQL Injection - Umgehen der Anmeldung: Unterschied zwischen den Versionen

Aus xinux.net
Zur Navigation springen Zur Suche springen
 
(35 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:
 
* Security level: 0
 
* Security level: 0
  
=Ziel=
+
=Allgemein=
 +
*[[SQL Injection - Übersicht]]
 +
 
 +
=Beispiel: Umgehen der Anmeldung=
 
*Oft sind Anmeldungen datenbankbasiert.
 
*Oft sind Anmeldungen datenbankbasiert.
 
*Test der Anmeldeseite auf Möglichkeiten der Informationsgewinnung.
 
*Test der Anmeldeseite auf Möglichkeiten der Informationsgewinnung.
Zeile 16: Zeile 19:
 
[[Datei:Mutillidae-01.png]]
 
[[Datei:Mutillidae-01.png]]
  
=generierter Fehler=
+
=generierter Fehler 1=
 
[[Datei:Mutillidae-02.png]]
 
[[Datei:Mutillidae-02.png]]
  
 
=Erkenntnisse=
 
=Erkenntnisse=
 
*Dem Anwender wird eine Fehlermeldung mit vielen Systeminformationen angezeigt.
 
*Dem Anwender wird eine Fehlermeldung mit vielen Systeminformationen angezeigt.
*Die Tatsache dass ein solcher Fehler nicht abgefangen wird lässt auf angreifbarkeit schließen.
+
*Die Tatsache dass ein solcher Fehler nicht abgefangen wird lässt auf Angreifbarkeit schließen.
 
*Im Hintergrund läuft eine MySQL Datenbank.
 
*Im Hintergrund läuft eine MySQL Datenbank.
 
*Die abgesetzte SQL-Abfrage ist zu sehen. Hier erscheint in der Abfrage nur der Benutzername.
 
*Die abgesetzte SQL-Abfrage ist zu sehen. Hier erscheint in der Abfrage nur der Benutzername.
  SELECT username FROM accounts WHERE username=''''';
+
  <nowiki>SELECT username FROM accounts WHERE username=''';</nowiki>
  
=Manipulation der Abfrage=
+
=weiterer Test=
*Eingabe von '1=1-- im Eingabefeld für den Namen.  
+
*da in der obigen Abfrage nur der Benutzername auftaucht geben wir nun ein einzelnes Hochkomma im Eingabefeld für das Passwort ein.
 +
[[Datei:Mutillidae-03.png]]
  
 +
=generierter Fehler 2=
 +
[[Datei:Mutillidae-04.png]]
 +
*Hier tauchen sowohl Benutzername und Passwort in der Abfrage auf.
  
*Eingabe im Namensfeld:
+
=Manipulation der Abfrage=
  ' or 1=1-- -
+
*Eingabe von 'or 1=1-- im Eingabefeld für den Namen. (Achtung: am Schluß muss ein Leerzeichen sein.)
 +
*generierte Abfrage:
 +
  <nowiki>SELECT username FROM accounts WHERE username=''or 1=1-- ';</nowiki>
 +
*Die beiden Minuszeichen mit folgendem Leerzeichen bewirken, dass MySQL den Rest der Zeile als Kommentar interpretiert. (wird hier gebraucht wegen dem abschließenden einzelnen Hochkomma das sonst einen Fehler generieren würde.)
  
 +
*Nach Anklicken des Buttons Login ist man als Benutzer admin angemeldet.
 +
*Der Grund, dass man hier als Admin angemeldet ist, liegt in der Struktur der Anwendung, da der Benutzer admin als erster Eintrag in der entsprechenden Tabelle steht.
  
 +
=Schlußfolgerungen=
 +
*Grundlage einer Manipulation / eines Eindringens ist die Informationssammlung.
 +
*Je nach gefundenen Informationen sind die Manipulationsmöglichkiten unterschiedlich.
 +
**System
 +
**Struktur der Anwendung
 +
**Struktur der Datenbank
 +
**abgefangene / nicht abgefangene Fehler
  
[[Datei:Mutillidae-02.png]]
+
=Gegenmassnahmen=
*Nach Anklicken des Buttons Login ist man als Benutzer admin angemeldet.
+
*Niemals Variablen von Aussen (Benutzereingaben) ohne Bearbeitung / Prüfung übernehmen und in SQL-Abfragen verwenden.
 +
*Entsprechende Funktionen der Programmiersprachen / Scriptsprachen benutzen, die problematische Zeichen in variablen durch sichere Strings ersetzt. (Escape / Entwertung von Sonderzeichen)

Aktuelle Version vom 24. Juni 2021, 12:27 Uhr

Voraussetzung

  • Security level: 0

Allgemein

Beispiel: Umgehen der Anmeldung

  • Oft sind Anmeldungen datenbankbasiert.
  • Test der Anmeldeseite auf Möglichkeiten der Informationsgewinnung.
  • Test der Anmeldeseite auf Möglichkeiten der Manipulation.

Aufruf der Anmeldemaske

  • OWASP 2017 -> A1 Injection (SQL) -> SQLi Bypass Authentication -> Login

Versuch einen Fehler zu generieren

  • Eingabe eines einzelnen Anführungszeichens in Eingabefeld Username.
  • Ein einzelnes Anführungszeichen ist bei Datenbanken ein spezielles Zeichen.

Mutillidae-01.png

generierter Fehler 1

Mutillidae-02.png

Erkenntnisse

  • Dem Anwender wird eine Fehlermeldung mit vielen Systeminformationen angezeigt.
  • Die Tatsache dass ein solcher Fehler nicht abgefangen wird lässt auf Angreifbarkeit schließen.
  • Im Hintergrund läuft eine MySQL Datenbank.
  • Die abgesetzte SQL-Abfrage ist zu sehen. Hier erscheint in der Abfrage nur der Benutzername.
SELECT username FROM accounts WHERE username=''';

weiterer Test

  • da in der obigen Abfrage nur der Benutzername auftaucht geben wir nun ein einzelnes Hochkomma im Eingabefeld für das Passwort ein.

Mutillidae-03.png

generierter Fehler 2

Mutillidae-04.png

  • Hier tauchen sowohl Benutzername und Passwort in der Abfrage auf.

Manipulation der Abfrage

  • Eingabe von 'or 1=1-- im Eingabefeld für den Namen. (Achtung: am Schluß muss ein Leerzeichen sein.)
  • generierte Abfrage:
SELECT username FROM accounts WHERE username=''or 1=1-- ';
  • Die beiden Minuszeichen mit folgendem Leerzeichen bewirken, dass MySQL den Rest der Zeile als Kommentar interpretiert. (wird hier gebraucht wegen dem abschließenden einzelnen Hochkomma das sonst einen Fehler generieren würde.)
  • Nach Anklicken des Buttons Login ist man als Benutzer admin angemeldet.
  • Der Grund, dass man hier als Admin angemeldet ist, liegt in der Struktur der Anwendung, da der Benutzer admin als erster Eintrag in der entsprechenden Tabelle steht.

Schlußfolgerungen

  • Grundlage einer Manipulation / eines Eindringens ist die Informationssammlung.
  • Je nach gefundenen Informationen sind die Manipulationsmöglichkiten unterschiedlich.
    • System
    • Struktur der Anwendung
    • Struktur der Datenbank
    • abgefangene / nicht abgefangene Fehler

Gegenmassnahmen

  • Niemals Variablen von Aussen (Benutzereingaben) ohne Bearbeitung / Prüfung übernehmen und in SQL-Abfragen verwenden.
  • Entsprechende Funktionen der Programmiersprachen / Scriptsprachen benutzen, die problematische Zeichen in variablen durch sichere Strings ersetzt. (Escape / Entwertung von Sonderzeichen)