Wykorzystanie mod_rewrite do wykrywania ataków XSS
Moduł mod_security serwera Apache jest znanym i szeroko stosowanym uzupełnieniem zabezpieczeń aplikacji internetowych - zaporą ogniową działającą na poziomie protokołu HTTP (Web Application Firewall). Można go użyć między innymi do wykrywania potencjalnych ataków Cross Site Scripting. Niestety mniejsze serwisy, wykorzystujące usługi hostingowe z dolnej półki, pozbawione są często możliwości wykorzystania tego modułu. W takim przypadku fragment funkcjonalności mod_security można próbować przenieść do reguł mod_rewrite. Nie jest to optymalne rozwiązanie, ale pozwala utworzyć prowizoryczną warstwę ochronną bez modyfikacji samej aplikacji.
Załóżmy, że naszym celem jest otrzymywanie na bieżąco informacji o próbach dokonywania ataków XSS w niewielkim serwisie. Ustawiamy (w pliku .htaccess) następujące reguły mod_rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{PATH_INFO} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{HTTP_COOKIE} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{HTTP_FORWARDED} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{HTTP:Host} (\"|%22|>|%3E|<|%3C|\'|%27|script|alert|eval|document).* [NC,OR]
RewriteCond %{HTTP_REFERER} (\"|%22|>|%3E|<|%3C|\'|%27).* [NC]
RewriteCond %{REQUEST_FILENAME} (.php|.html)
RewriteRule ^(.*)$ lpv.php [NC,E=LPV_FILENAME:%{REQUEST_FILENAME},E=LPV_PATH:%{PATH_INFO}]
Następnie tworzymy skrypt lpv.php, do którego przekierowane będą podejrzane żądania. Jego działanie będzie następujące:
- sprawdzi, czy został wywołany przez mod_rewrite, czy bezpośrednio;
- wyśle do nas list z danymi podejrzanego żądania (nie polecam takiego rozwiązania w praktyce);
- odtworzy pierwotne żądanie i “posprząta” po mod_rewrite w $_SERVER;
- zmieni ustawienie include_path, zamieniając aktualny katalog na ścieżkę pierwotnego żądania;
- dołączy plik, którego dotyczyło pierwotne żądanie.
W ten sposób z punktu widzenia użytkownika (oraz aplikacji) obsługa żądania przebiegnie bez zmian, natomiast w międzyczasie informacja o potencjalnym ataku trafi do nas. Przykładowy skrypt do testów można znaleźć tutaj.
Uwaga: powyższy przykład to czysto testowy kod, pisany w środku nocy - nie polecam wykorzystywania metodą “kopiuj-wklej”, a szczególnie w serwisie o stałym ruchu użytkowników.