CInsects/Protokolle/CInsects:Treffen-2010-10-19: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
Zur Navigation springen Zur Suche springen
(CInsects-Treffen leicht dokumentiert)
 
(viel mehr Inhalt)
Zeile 1: Zeile 1:
Wir haben SQL-Injections gemacht.
+
Heute haben wir uns überwiegend mit SQL-Injections beschäftigt.
 +
 
 +
== SQL-Injections ==
 +
=== Algemeines zu SQL ===
 +
 
 +
Ein einfacher SQL befehl hat die struktur:
 +
 
 +
  SELECT * FROM tabelle WHERE spalte='text'
 +
 
 +
mit AND und OR können mehrere bedingungen verknüft werden.
 +
 
 +
Wenn unsere Datenbank z.B. eine Tabelle user enthält in welcher die Daten zu den Usern gespeichert sind, und der Name des Users in der Spalte 'username' steht, kann man z.B. mit
 +
 
 +
  SELECT * FROM user WHERE username='Bob'
 +
 
 +
alle verfügbaren Informationen zu Bob abgeruffen werden. Die anführungszeichen um Bob sind ganz wichtig da MySQL es sonst nicht als Zeichenkette sondern als nahmen einer Spalte versteht. Wenn man jetzt noch ein Passwort überprüfen will und als rückgabe nur die ID des Users braucht sieht das so aus:
 +
 
 +
  SELECT userID FROM user WHERE username='Bob' AND password='blub'
 +
 
 +
=== Erste Angriffe ===
 +
 
 +
Unser erstes Angriffsziel war ein einfaches, ungesichertes Loginscript welches als eingabe den Usernamen und ein Passwort abfragt. Beim Anmeldeversuch wurde, um den angriff zu vereinfachen der verwendete SQL-Befehl angezeigt. Wenn anstat eines Passwortes ein Hochkomma (') eingegeben wurde konnte man gleich sehen das dies zu einem Fehler führt. Das liegt daran das durch die Eingabe im SQL am ende 3 hochkomata sind. Die Zeichenkette des Passwortes geht dann bis zum zweiten ' das einzelne ' am ende ist zuviel und wird nicht wieder geschlossen. Außerdem darf an dieser stelle keine Zeichenkette mehr stehen da sie "Frei im raum" schwebt. Die Kunst des angriffes besteht jetzt darin die Eingabe so zu wählen das dass SQL noch Korrekt ist, uns aber trotzdem einen User zurückliefert so dass wir eingeloggt werden. Am einfachsten ist es am ende einen Wahren vergleich mit OR anzuhängen damit die ganze bedingung wahr wird. Da wir am Ende noch ein ' der Orginalen Abfrage öberhaben ist es am einfachsten z.B. 'a' zu nehmen. Daher geben wir bei Passwort
 +
 
 +
  ' OR 'a'='a
 +
 
 +
ein. Das wird vom Server dann zu
 +
 
 +
  SELECT userID FROM user WHERE username=' ' AND passwort=' ' OR 'a'='a'
 +
 
 +
was immer ein ergebnis zurückgiebt (solange es überhaubt einen User gibt) da a=a immer whar ist, und durch das OR der rest dann egal wird.
 +
 
 +
 
 +
auch hier werde ich die Tage weiterschreiben
 +
 
 +
=== UNION SELECT ===
 +
 
 +
Schreibe ich die Tage --[[Benutzer:0rokita|Nils]] 21:11, 20. Okt. 2010 (CEST)
 +
 
 +
== Sonstiges ==
 +
* Der nächste Termin wird noch bekanntgegeben
 +
* Für Kekse ist gesorgt
 +
* Wir werden uns die nächsten paar Wochen mit Websicherheit beschäftigen
 +
** Nächstes mal werden wir Blind SQL-Injection machen
 +
 
 +
== Links ==
  
 
[http://sqlinj.cinsects.de/ Testumgebung] laueft nur, wenn man vorher 8pridoeh anschreibt.
 
[http://sqlinj.cinsects.de/ Testumgebung] laueft nur, wenn man vorher 8pridoeh anschreibt.
  
[http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ SQL Injection Cheat Sheet]
+
[http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ SQL Injection Cheat Sheet] Tipps und Tricks zu SQL Injections

Version vom 20. Oktober 2010, 21:11 Uhr

Heute haben wir uns überwiegend mit SQL-Injections beschäftigt.

SQL-Injections

Algemeines zu SQL

Ein einfacher SQL befehl hat die struktur:

  SELECT * FROM tabelle WHERE spalte='text'

mit AND und OR können mehrere bedingungen verknüft werden.

Wenn unsere Datenbank z.B. eine Tabelle user enthält in welcher die Daten zu den Usern gespeichert sind, und der Name des Users in der Spalte 'username' steht, kann man z.B. mit

  SELECT * FROM user WHERE username='Bob'

alle verfügbaren Informationen zu Bob abgeruffen werden. Die anführungszeichen um Bob sind ganz wichtig da MySQL es sonst nicht als Zeichenkette sondern als nahmen einer Spalte versteht. Wenn man jetzt noch ein Passwort überprüfen will und als rückgabe nur die ID des Users braucht sieht das so aus:

 SELECT userID FROM user WHERE username='Bob' AND password='blub'

Erste Angriffe

Unser erstes Angriffsziel war ein einfaches, ungesichertes Loginscript welches als eingabe den Usernamen und ein Passwort abfragt. Beim Anmeldeversuch wurde, um den angriff zu vereinfachen der verwendete SQL-Befehl angezeigt. Wenn anstat eines Passwortes ein Hochkomma (') eingegeben wurde konnte man gleich sehen das dies zu einem Fehler führt. Das liegt daran das durch die Eingabe im SQL am ende 3 hochkomata sind. Die Zeichenkette des Passwortes geht dann bis zum zweiten ' das einzelne ' am ende ist zuviel und wird nicht wieder geschlossen. Außerdem darf an dieser stelle keine Zeichenkette mehr stehen da sie "Frei im raum" schwebt. Die Kunst des angriffes besteht jetzt darin die Eingabe so zu wählen das dass SQL noch Korrekt ist, uns aber trotzdem einen User zurückliefert so dass wir eingeloggt werden. Am einfachsten ist es am ende einen Wahren vergleich mit OR anzuhängen damit die ganze bedingung wahr wird. Da wir am Ende noch ein ' der Orginalen Abfrage öberhaben ist es am einfachsten z.B. 'a' zu nehmen. Daher geben wir bei Passwort

 ' OR 'a'='a

ein. Das wird vom Server dann zu

 SELECT userID FROM user WHERE username=' ' AND passwort=' ' OR 'a'='a'

was immer ein ergebnis zurückgiebt (solange es überhaubt einen User gibt) da a=a immer whar ist, und durch das OR der rest dann egal wird.


auch hier werde ich die Tage weiterschreiben

UNION SELECT

Schreibe ich die Tage --Nils 21:11, 20. Okt. 2010 (CEST)

Sonstiges

  • Der nächste Termin wird noch bekanntgegeben
  • Für Kekse ist gesorgt
  • Wir werden uns die nächsten paar Wochen mit Websicherheit beschäftigen
    • Nächstes mal werden wir Blind SQL-Injection machen

Links

Testumgebung laueft nur, wenn man vorher 8pridoeh anschreibt.

SQL Injection Cheat Sheet Tipps und Tricks zu SQL Injections