runic.pl
Bezpieczeństwo aplikacji internetowych

Wykorzystanie mod_rewrite do wykrywania ataków XSS

[30-01-2007]

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.



Komentarze

  1. |

    Co z POSTami? Mod rewrite ich chyba nie złapie.

  2. |

    Zgadza się – filtrować w ten sposób możemy tylko nagłówki HTTP. Teoretycznie można byłoby cały ruch serwisu przepuścić przez skrypt (wtedy zawartość POST też mogłaby być sprawdzana).



Leave a Comment