Ominięcie firewalla aplikacyjnego WebKnight
Wstęp
Nasz zespół wykrył lukę w domyślnej konfiguracji firewalla aplikacyjnego WebKnight, umożliwiającą w prosty sposób ominięcie filtra chroniącego przed podatnością SQL injection.
O firewallu aplikacyjnym
Ideę firewalla aplikacyjnego prezentowaliśmy w lutym 2009r. na konferencji GigaCon. Ciekawe informacje o tej klasie rozwiązań można uzyskać również pod tym adresem.
W ogólności, webowe firewalle aplikacyjne (ang. Web Application Firewalls – WAF) umożliwiają między innymi blokowanie określonego typu ataków na aplikacje webowe – np. SQL injection.
Nieprawidłowa konfiguracja WAF umożliwia często w prosty sposób ominięcie oferowanej przez WAF ochrony. O taką nieprawidłową konfigurację nie jest trudno - o czym świadczy realny przykład poniżej.
Luka w konfiguracji WebKnight
Jedną z metod ochrony, stosowaną przez firewalle aplikacyjne jest tzw. blacklisting. Metoda polega na wyszczególnieniu potencjalnie niebezpiecznych słów lub fraz mogących znaleźć się w filtrowanej komunikacji oraz zablokowanie komunikacji zawierającej tego typu elementy.
Poniżej prezentujemy wycinek konfiguracji firewalla WebKnight, przedstawiający fragment reguł blacklistingu dla podatności SQL injection.
<SQL_Injection_Keywords App='List' Explanation='These are the SQL keywords for the SQL injection scanning. If two or more are found an alert is triggered and the request will be blocked.'>
<Item>'</Item>
<Item>`</Item>
<Item>;</Item>
<Item>--</Item>
<Item>select</Item>
<Item>insert</Item>
<Item>update</Item>
<Item>delete</Item>
<Item>drop </Item>
<Item>alter </Item>
<Item>create </Item>
<Item>inner join</Item>
<Item>from </Item>
<Item>where </Item>
<Item>union </Item>
…
W pierwszym momencie trudno znaleźć błąd w tej konfiguracji. Jednak po dokładniejszej analizie, okazuje się iż część słów kluczowych wyszczególniona jest ze spacją jako sufiksem, np.:
<Item>from </Item>
<Item>where </Item>
<Item>union </Item>
Jakie mogą być skutki takiej konfiguracji? Otóż firewall zareaguje blokadą na wystąpienie słowa ‘UNION ‘, (ze spacją jako suffixem), nie zareaguje natomiast na słowo ‘UNION/**/'
Dla wielu implementacji SQL ciągi ‘UNION ‘ oraz 'UNION/**/' są tożsame...
Realny przykład ominięcia firewalla WebKnight
Podczas jednego z audytów bezpieczeństwa serwisu www chronionego przez WebKnight, przedstawiliśmy następujący proof of concept:
http://no.such.site/news.php?ID=2/**/union/**/select/**/null,table_name/**/from/**/information_schema.tables
W skrócie – wszystkie spacje zostały zastąpione ciągami /**/. Tego typu działanie, ze względu na wskazane powyżej niepoprawne domyślne reguły firewalla, spowodowało możliwość jego ominięcia.
Powyższy atak umożliwia wyświetlenie nazwy „pierwszej lepszej” tabeli bazodanowej zdefiniowanej w systemie. Często pobranie tego typu danych jest jednym z pierwszych kroków dalszego ataku – przykładowo dążącego do wylistowania loginów/haseł użytkowników portalu (w tym danych administratorów portalu).
Posiadając dane dostępowe (użytkownika oraz hasło) administratora portalu - atakujący ma duże możliwości działania.
Jak się chronić?
- Świadomie wdrażać rozwiązania klasy web application firewall (WAF).
- Wykonywać audyty bezpieczeństwa środowiska chronionego WAF.
- Na bieżąco monitorować logi generowane przez firewalle i systemy IDS.
Dodatkowe informacje
Luka występuje w najnowszej wersji WebKnight (2.2) oraz najprawdopodobniej dotyczy wielu wcześniejszych wersji. Producent potwierdził istnienie błędu, oraz zapowiedział aktualizację reguł filtrowania w kolejnej wersji firewalla.
