Modsecurity-apache/Limiter-methodes-HTTP
Limiter les méthodes HTTP autorisées
Description
Le jeu de règles de base contient une permission qui peut être supprimée. Il s'agit d'interdire certaines méthodes HTTP (pour plus de renseignements, référez-vous à la Rfc2616 spécifiant le protocole HTTP 1.1) qui pourraient présenter un risque de sécurité (méthodes PROPFIND, OPTIONS ou méthodes arbitraires).
Présentation théorique
Méthode GET
La méthode GET est certainement la plus utilisée, constituant la base du protocole. Elle permet d'interroger le serveur pour obtenir le contenu d'une page, comme le montre l'exemple qui suit. Le serveur, en retour envoie l'en-tête de réponse ainsi que le corps de la page demandée.
$ nc 127.0.0.1 80 GET /index.php/Accueil HTTP/1.1 Host: 127.0.0.1 HTTP/1.1 200 OK Date: Sat, 05 Dec 2009 13:26:57 GMT Server: X-Powered-By: PHP/5.3.0 Content-language: fr Vary: Accept-Encoding,Cookie,User-Agent X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: private, must-revalidate, max-age=0 Last-Modified: Tue, 01 Dec 2009 20:06:10 GMT Content-Length: 29016 Content-Type: text/html; charset=utf-8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> [...]
Méthode HEAD
La méthode HEAD est identique à la méthode GET à ceci près qu'elle ne fournit que l'en-tête de réponse (la méthode GET fournit toute la réponse, à savoir l'en-tête et le corps). Exemple :
$ nc 127.0.0.1 80 HEAD /index.php/Accueil HTTP/1.1 Host: 127.0.0.1 HTTP/1.1 200 OK Date: Fri, 04 Dec 2009 21:57:02 GMT Server: Content-language: fr Vary: Accept-Encoding,Cookie,User-Agent X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: private, must-revalidate, max-age=0 Last-Modified: Fri, 04 Dec 2009 10:59:30 GMT Content-Type: text/html; charset=utf-8
Méthode POST
Thank you for your comprehension.
Méthode OPTIONS
La méthode OPTIONS permet de lister les méthodes acceptées par le serveur (GET, POST, OPTIONS, TRACE, etc.). L'exemple qui suit montre que la méthode OPTIONS est autorisée par le serveur (code HTTP 200).
$ nc 127.0.0.1 80 OPTIONS /HTTP/1.1 Host: 127.0.0.1 HTTP/1.1 200 OK Date: Fri, 04 Dec 2009 18:39:42 GMT Server: Content-language: fr [...]
Après la mise en place de la limitation, un message avertit que la méthode n'est pas implémentée (Code HTTP 501).
$ nc 127.0.0.1 80 OPTIONS / HTTP/1.1 Host: 127.0.0.1 HTTP/1.1 501 Method Not Implemented Date: Fri, 04 Dec 2009 18:22:11 GMT Server: Allow: [...]
Méthode TRACE
Thank you for your comprehension.
Méthode PUT
Thank you for your comprehension.
Méthode DELETE
Thank you for your comprehension.
Méthode CONNECT
Thank you for your comprehension.
Méthode PROPFIND
Thank you for your comprehension.
Méthodes arbitraires
Thank you for your comprehension.
Mise en oeuvre
Editer le fichier modsecurity_crs_30_http_policy.conf dès règles de base :
vim /usr/local/apache2/conf/modsecurity/base_rules/modsecurity_crs_30_http_policy.conf
Dans le fichier, commenter la ligne (la faire précéder d'un #) :
#SecRule REQUEST_METHOD "!^((?:(?:POS|GE)T|OPTIONS|HEAD))$" "phase:2,t:none,block,nolog,auditlog,status:501,msg:'Method is not allowed by policy', severity:'2',id:'960032',tag:'POLICY/METHOD_NOT_ALLOWED',setvar:tx.anomaly_score=+5,setvar:tx.policy_score=+1,setvar:tx.%{rule.id}-POLICY/METHOD_NOT_ALLOWED-%{matched_var_name}=%{matched_var}"
et ajouter la ligne suivante juste en dessous :
SecRule REQUEST_METHOD "!^(?:GET|POST|HEAD)$" "phase:1,t:none,deny,status:501,msg:'Request content type is not allowed by policy',id:'960010',tag:'POLICY/ENCODING_NOT_ALLOWED',severity:'4'"