héhéhé un bien bel exploit que celui-là... pour avoir pas mal bossé dessus et m'être fait mon propre exploit (différent de celui-ci mais je ne rentrerai pas dans les détails), je peux t'aider à le comprendre si tu veux.
Je t'explique le fonctionnement global du script, si tu veux plus de détails viens me voir sur le chan IRC: le 1er point à savoir c que la variable incriminée $signature_bbcode_uid n'est pas initialisée dans certains cas, autrement dit si tu te débrouilles bien, tu peux lui injecter la valeur que tu veux.
C'est là que ça se complique : si les variables globales sont autorisées sur le serveur où tu test cet exploit, alors tu vas pouvoir appliquer une technique très connue qui est l'overwrite du tableau des globales. Je ne me lancerai pas dans une explication à la BufferBob (lol) donc je te renvoie à un très bon article réalisée sur cette vulnérabilité de php à l'adresse suivante :
http://www.hardened-php.net/globals-problemLis le bien et essaye de comprendre le principe. C'est grâce à cette vulnérabilité de PHP que tu vas arriver à donner la valeur adéquate à $signature_bbcode_uid . Il faut aussi savoir que ça ne marche pas sur toutes les versions de PHP (ce script ne marche que sur PHP < 5.0.5 il me semble).
Je ne m'attarde pas là dessus car c'est relativement compliqué et que tu apprendras bcp mieux en te documentant toi-même
Donc à ce moment là du script tu donnes la valeur que tu veux à $signature_bbcode_uid : très bien mais dans la plupart des cas ça ne donnerait pas grand chose... sauf ici! Parce que cette variable passe par un preg_replace et que la variable n'est pas du tout sécurisée. Comme tu l'as trouvé, preg_replace permet d'exécuter du code php dans le second argument, si le premier contient le "/e " modifier. Mais ce modifier doit être placé à la fin de ton 1er argument, juste avant le délimiteur. Or $signature_bbcode_uid n'est pas à la fin du 1er argument, il va donc falloir que tu fasses en sorte que ce qu'il y a après $signature_bbcode_uid dans le 1er argument du preg_replace soit ignoré : c'est là que tu utilises le fameux %00 qui est le code url pour le caractère NULL. Ce caractère a le très bon côté d'être considéré par PHP comme un signe de fin de chaine de caractères : si tu le places au milieu d'une chaine de carac, PHP ne regardera pas ce qu'il y a après, et considérera que ta chaine de carac s'arrête au dernier carac avant le carac NULL. C'est comme ça ici que tu t'en sors. Petite parenthèse : le %00 n'est interprété comme le carac NULL par PHP que si magic_quotes est sur off (à part dans une version spécifique de PHP 4, la 4.4.1 je crois), sinon il est transformé en \0 qui ne fait rien du tout lui. Il y a donc une ptite arnaque dans ce code....
Pour finir, si tu arrives à faire tout ce que j'ai dit avant, alors tu n'as plus qu'à mettre du code PHP dans le second argument du preg_replace et c'est gagné. Comme ce second argument, c'est ta signature dans ton profil, tu peux mettre ce que tu veux... Une fois que tu as tout fait proprement, il te suffit d'aller voir ton profil et normalement tu devrais voir apparaitre le résultat de ton code php (il faut bien sûr que ça affiche qqchose sinon tu exécuteras du code en aveugle).
Cet exploit est très joli mais il ne marchera que sur un nombre réduit de serveurs : il te faut PHP5 (en PHP4 **No Sms** la même méthode), register_globals sur ON, et magic_quotes sur OFF. Autant dire que ça ne marchera pas souvent... Perso j'ai fait un code bcp plus propre qui marche partout, sur toutes les configurations, mais qui a la gros désavantage d'exiger l'accès au panel d'admin
Mais si t'es bon, tu sais qu'il y a des ptites CSS qui trainent dans PHPBB <= 2.0.19 et donc si t'as fait l'épreuve 13 de hack, tu sais comment les exploiter :p
Bon je m'arrête là c'est un aperçu très global et vulgarisé du fonctionnement du script. Si tu veux plus de détails, demande le ici ou sur le chan!