Web-Sicherheit

Oktober 12, 2011

Jenseits von SQL-Injection: Verschleiern und Umgehen

Filed under: Allgemein — sebastiankuebeck @ 08:29
Tags: , , , , , ,

Prathan „ZeQ3uL“ Phongthiproek und „Suphot Boonchamnan“ veröffentlichten kürzlich eine Umfangreiche Anleitung in der zahlreiche Techniken beschrieben werden, mit denen man Filtertechniken wie Web Application Firewalls (kurz WAFs) umgehen kann. Ich habe in der Vergangenheit bereits zahlreiche Techniken dieser Art vorgestellt und man möchte meinen, dass es zu diesem Thema nichts mehr fundamental Neues zu veröffentlichen gäbe, dennoch zeigt dieses Paper einige Tricks, die mir bisher noch nicht bekannt waren.

Da die WAF-Hersteller laufend versuchen, mit den Angreifern schrittzuhalten, konzentrieren sich letztere zusehends auf das Ausnützen von Eigenheiten (neudeutsch Idiosynkrasien) einzelner Datenbankprodukte, die von den meisten Filtertechniken nicht berücksichtigt werden. So kann man in MySQL-Abfragen && und || anstelle der logischen Operatoren and und or verwenden. Auch wird von den meisten Filtern das SQL-Schlüsselwort union blockiert, da dieses von Angreifern häufig dazu dazu verwendet wird, Datenbankinhalte von Tabellen anzuzeigen, die von der Webanwendung eigentlich nicht angezeigt werden sollten. Diese Einschränkung kann ein Angreifer teilweise jedoch wie folgt umgehen:

union select user, password from users // diese Abfrage wird blockiert 
1 || (select user from users where user_id = 1) = 'admin' // diese jedoch nicht

In der geänderten Version ist jetzt allerdings ein Blind-SQL-Injection-Angriff nötig, der deutlich Aufwändiger ist, als die Variante mit union, denn man muss jetzt Benutzernamen durch Versuch und Irrtum ermitteln, anstatt sie direkt auszugeben.

Das Filtern des einfachen Hochkomma (') und von Leerzeichen kann man durch Hexadezimalzahlen, die man von der MySQL in Zeichen umwandeln lässt, umgehen:

1 || substr(user,1,1) = 0x61 // oder...
1 || substr(user,1,1) = unhex(61)

Wird auch das gefiltert, hilft die Funktion CONV, Dezimalzahlen in Hexadezimalzahlen umzuwandeln, welche dann wiederum in Zeichen umgewandelt werden können:

1 || substr(user,1,1) = lower(conv(61,10,36))

Wird auch SUBSTR gefiltert, kann man sein Glück noch mit LPAD versuchen:

1 || lpad(user,7,1)

In weiteren Abschnitten werden die Techniken der „HTTP-Parameterverunreinigung“, die ich bereits in einer vorhergehenden Artikelserie beschrieben habe, übersichtlich zusammengefasst und es wird auf Schwächen einzelner WAF-Produkte eingegangen. Insgesamt ein guter, wenn auch keineswegs vollständiger Überblick über gängige WAF-Umgehungstechniken.

Schreibe einen Kommentar »

Es gibt noch keine Kommentare.

RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Bloggen auf WordPress.com.

%d Bloggern gefällt das: