CInsects/Protokolle/CInsects:Treffen-2010-10-19
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