The Chorizo ! International PHP Conference Quiz
Publi� le 13 novembre 2006

Allez, j'ai un peu délaissé la lecture des articles syndiqués alors je suis passé à côté de ce quizz qui permettait de gagner un ipod, quand même ! Je vais tenter de répondre moi aussi (promis, je ne regarde pas les réponses).


Quelle ligne protège réellement contre les [XSS] ?

[ ] echo '<a href="index.php?name='.addslashes($_GET['name']).'">name</a>';
[ ] echo '<a href="index.php?name='.strip_tags($_GET['name']).'">name</a>';
[ ] echo '<a href="index.php?name='.preg_replace('|\W|', '', $_GET['name']).'">Name</a>";

La première ligne est un piège. Le addslashes() protège seulement contre les injections SQL. La deuxième bien qu'elle semble enlever tout ce qui ressemble de près ou de loin à un script Javascript n'est pas suffisante non plus car elle ne fonctionne que si le HTML est bien formé [1]. Le seul moyen de s'en sortir est d'utiliser une expression régulière.


Dans quelle ligne on peut faire une inclusion à distance ?

[ ] include(dirname(__FILE__).'/lang/lang_'.$_GET['lang'].'.php');
[ ] preg_replace('/_NAME_/msiUe', "htmlentities(\"$_GET[name]\")", 'Hello Mr _NAME_ ! ');
[ ] eval("echo 'Hello Mr ".htmlentities($_GET['name'], ENT_QUOTES)."';");

Le premier est correct. Même en manipulant la variable lang, ont peut tout juste afficher les fichiers PHP du répertoire courant qui commencent par lang_. L'idéal aurait été d'utiliser un switch avec tous les cas possibles. Cela peut éviter de favoriser de futurs trous de sécurité. Ex :


switch($_GET['lang']) {
    case
'fr' : include('lang_fr.php');
                break;
    case
'en' : include('lang_en.php');
                break;
    default: ...;
}

Je me méfie du deuxième. L'expression régulière est contenue entre les slashs (/) donc tout ce qui suit, ce sont les modificateurs dont le modificateur e (eval) qui permet d'exécuter une fonction PHP quelconque sur la chaîne de remplacement. A partir de là, on doit pouvoir faire un include d'un fichier.

Le 3ème évalue aussi une expression qui contient une variable globale que l'on peut manipuler. Le htmlentities ne protège que contre les XSS. On doit donc pouvoir exécuter un code arbitraire à distance.

Bien sûr si le paramètre de configuration allow_url_fopen est à false, c'est râpé pour les inclusions.


Quelle balise peut contenir du code JavaScript ?

[ ] <img />
[ ] <br />
[ ] <style></style>
[ ] <meta></meta>
[ ] each of the here named tags can contain JavaScript

A mon avis, toutes ! On peut mettre du code javascript entre le début et la fin d'une balise comme presque n'importe où dans la page HTML d'ailleurs. En tant que paramètre de balise, le code Javascript doit être dans un événement du style : onclick, onfocus.


Qu'est-ce qu'il n'est pas possible de faire si votre site contient une vulnérabilité XSS ?

[ ] Il est possible de récupérer les logins des utilisateurs à travers les sessions.
[ ] Les visiteurs de votre intranet peuvent être snannées.
[ ] Chaque touche appuyée peut être récupérée par des tiers.
[ ] Les disques durs de vos utilisateurs peuvent être formatés.

Bien évidemment le dernier. On ne peut pas lancer de commande système (format c : /u /s, e2fs.vfat /dev/hda, rm -qfR /) pour formater le disque dur.



La suite sur le site de ThinkPHP (en)

[1] Tous les balises sont fermées