Hodžův blog

21 Bře

Apache mod-security

Několikrát jsem měl bohužel tu „čest“ nahlédnout do zdrojových kódů webových stránek našich klientů a teda řeknu Vám fuj… Troufám si říct, že bych byl schopný během několika málo vteřin vymyslet alespoň 10 XSS útoků. Vzhledem k tomu, že tato firma u nás hostuje více jak 300 různých portálů, bylo mi jasné, že oprava všech php scriptů je nemožná a tak jsem přemýšlel, jak jim alespoň trochu pomoci s bezpečností z mé strany.

Původně jsem zamýšlel použít globalní .htaccess a vněm mod_rewrite. Chtěl jsem parsovat veškeré požadavky na jednotlivé portály a sanitizovat je. Ačkoliv se toto řešení jevilo jako správné, v praxi jsem od něj musel upustit a najít řešení lepší. Oprášil jsem tak své záložky v prohlížeči a narazil na mod_security do Apache. Něco málo jsem o něm slyšel a už dlouho jsem ho chtěl vyzkoušet – teď k tomu byla velice vhodná příležitost.

Instalace na debianu byla více než snadná:

# 1. Nejprve jsem nainstaloval samotný modul
apt-get install libapache2-mod-security

# 2. Následně jsem jej povolili ke spuštění v Apache
a2enmod mod-security

# 3. Nechtěl jsem vymýšlet celou konfiguraci z hlavy a tak jsem si zkopíroval vzorovou
cp /usr/share/doc/libapache2-mod-security/examples/httpd2.conf.example-full /etc/apache2/conf.d/mod_security.conf

# 4. A tu jsem si upravil
vi /etc/apache2/conf.d/mod_security.conf

SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding Off
SecFilterForceByteRange 0 255
SecAuditEngine RelevantOnly
SecAuditLog /var/log/apache2/audit_log
SecFilterDebugLog /var/log/apache2/modsec_debug_log
SecFilterDebugLevel 0
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:500"
SecFilter /etc/[0-9a-z]
SecFilter /bin/[0-9a-z]
SecFilter /usr/[0-9a-z]
SecFilter /usr/bin/[0-9a-z]
SecFilter /tmp/[0-9a-z]
SecFilter cd\x20/tmp
SecFilter wget\x20
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "< [[:space:]]*script"
#SecFilter "<(.|\n)+>"

# 6. Následoval reload Apache serveru
/etc/init.d/apache2 force-reload

Co to všechno umí?
Mod_security nám vyčistí veškeré požadavky (jak GEt tak i POST) od zbytečných dvojitých lomítek (//), odkazů na sebe sama (./), dokáže zaměnit „\“ za „/“, přehodí %00 za obyčejnou mezeru kontroluje validitu a bytovou přesnost požadavku, dokáže vyhodnotit požadavek na základě regexpů.

Na základě detekce „řetezce“ je pak podle konfiguračního souboru (SecFilterDefaultAction) schopný vytvořit i několik akcí mezi něž patří:
deny – zakáže požadavek
allow – zastaví kontrolu pravidel a povolí request
status:xxx, – odpoví s HTTP statusem xxx
redirect:url, – přesměruje požadavek na danou (absolutní) adresu
exec:cmd – vykoná příkaz cmd (vhodné s nějakým odesílátkem emailů)
log – uloží request s detaily do logu
nolog – neukládá request do logu
pass – ignoruje toto pravidlo a pokračuje v dalších pravidlech
pause:xxx – pozdrží request o xxx milisekund (pozor at neprovedete DoS útok na sebe sami)
chain – skočí na další pravidlo v chainu
skipnext:n, přskočí n pravidel

Regexpové filtry
Asi nejjednodušším filtrem v mod_security je zadání SecFilter.
V konfiguračním souboru apache/mod_security máme:
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding Off
SecAuditEngine RelevantOnly
SecAuditLog /var/log/apache2/audit_log
SecFilterDebugLog /var/log/apache2/modsec_debug_log
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:500"
SecFilter /etc/passwd

Jakmile do prohlížeče zadáme adresu například http://hodza.net/test.php?shell=/etc/passwd, vyhodí nám prohlížeč chybu 500 a do /var/log/apache2/audit_log zapíše následující:

HTTP/1.1 500 Internal Server Error
X-Powered-By: PHP/4.3.10-19
Content-Length: 2166
Connection: close
Content-Type: text/html
========================================
Request: 85.160.65.12 - - [21/Mar/2007:11:23:55 +0100] "GET /test.php?shell=/etc/passwd HTTP/1.1" 500 2157
Handler: (null)
----------------------------------------
GET /test.php?shell=/etc/passwd HTTP/1.1
Host: hodza.net
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: IMAIL_SESS_KEY_1174461441-18654=LIuOFNUhDI3vlqgL; IMAIL_SESS_KEY_1174458493-41266=6pdFfVCoIZlnTdz2; IMAIL_SESS_KEY_1174458956-45632=22MSPZFhVgcl4HBF; wpthemefd01865e503f46c67c4df25a7c0983da=Magellan; IMAIL_SESS_KEY_1174458444-78097=yICVpRLlelQ7b4WR; IMAIL_TEST_COOKIE=test; PHPSESSID=4968f3ea1b79953b8e1e20febf5c3bfd; phpMyAdmin=d44d6e2f64ccd35352989d45c30a9b90; wordpressuser_fd01865e503f46c67c4df25a7c0983da=admin; wordpresspass_fd01865e503f46c67c4df25a7c0983da=2fb3192c5df98faf13d864c4a3b1fd06; dbx-postmeta=grabit:0+|1-|2-|3-|4-|5-&advancedstuff:0-|1-|2-
mod_security-message: Access denied with code 500. Pattern match "/etc/passwd" at THE_REQUEST
mod_security-action: 500
HTTP/1.1 500 Internal Server Error
X-Powered-By: PHP/4.3.10-19
Content-Length: 2157
Connection: close
Content-Type: text/html

Jak vidíte – krásné, jednoduché účinné a spolehlivé.
Další využití mod_security je na snadě. Při psaní příspěvku jsem si vzpomněl na Vlastu, kdy měl v komentářích na blogu snad desetkrát řetězec „Cheap phentermine….“. Přitom stačilo zapnout mod_security a dát do konfiguráku SecFilter „Cheap phentermine“ nebo zakázat spamerského User-Agenta, případně znepřístupnit blok IP adres odkud jsou příspěvky rozesílány.

2 Responses to “Apache mod-security”

  1. 1
    Leather Wristbands Says:

    ;*: I am really thankful to this topic because it really gives great information *-;

  2. 2
    Health Medicine Says:

    „,~ that seems to be a great topic, i really love it *,,

Leave a Reply

Hodžův blog is is proudly powered by Wordpress and the Magellan Theme