Homepage | Contact
Miniville

24 juillet 2007

Comment tricher à minville.fr et dans les systèmes de votes.

Le fonctionnement des systemes de votes

Par adresse IP :
Le vote se base par rapport à l'adresse internet de l'utilisateur. En PHP, le système va utiliser la variable $_SERVER['REMOTE_ADDR'], qui permet de récupérer l'IP de l'hôte. Il va donc ainsi enregistrer les IP des votants. Pour prendre en compte, les personnes qui passe par un proxy, on peut prendre en compte des paramètres supplémentaires tels que : HTTP_X_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_FORWARDED, HTTP_VIA, HTTP_X_COMING_FROM, HTTP_COMING_FROM... Pour contourner ce système, il suffit d'utiliser des serveurs proxy HTTP (anonyme de préférence). Il est facile de se procurer une liste de proxy avec une recherche google par exemple.

Par l'utilsation des cookies :
Lorsqu'un vote est prise en compte, un cookie est enregistré dans le navigateur. Si on veut revoter, la présence du cookie indique un vote précédent. Le fait de supprimer les cookies permet de réactiver le vote.

Bien sûr, il est conseillé de faire un petit programme pour automatiser les votes. De même l'utilisation de WireShark (sniffer réseau) ou d'un visualisateur d'entete HTTP s'avère très utile dans la phase d'analyse.

Le cas miniville.fr

La triche sur miniville.fr est d'autant plus facile qu'il a un problème dans la gestion du paramètre HTTP_X_FORWARDED_FOR des requêtes HTTP.
D'abord, il suffit de forger une requête HTTP, avec le cookie suivant pour passer la vérification de javascript et des cookies : Cookie : X-MV-Referer= ; X-Ref-Ok=1
Miniville gère les requetes via un proxy grace au param&eagrave;tre tel que X_FORWARDED_FOR. Cependant, il n'y a aucune vérification de la cohérence de l'IP, et il n'y a pas de limitation pour un proxy donné. Donc l'astuce est d'ajouter une option X-forwarded-For à la requete HTTP. X-Forwarded-For : $a.$b.$c.$d avec a b c d des nombres aléatoires entre 1 et 254 (IP plus ou moins valide mais c'est pas génant).
Voici la requete HTTP en entier (url = / et host = antiville.miniville.fr par exemple) :


GET $url HTTP/1.1
Host : $host
X-Forwarded-For : $a.$b.$c.$d
User-Agent : Mozilla/5.0 (Windows ; U ; Windows NT 5.1 ; fr ; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Cookie : X-MV-Referer= ; X-Ref-Ok=1


Le User-Agent est facultatif bien sur. Pour éviter tout saturation du serveur et économiser un peu de ressources, vous pouvez envoyer une fermeture de la connexion après l'envoi des données + delai (10ms semble correcte). De meme vous pouvez cascader les requetes HTTP dans une meme connexion (au moins 6 requetes sont acceptées).

Amusez vous bien.

PS: je ne mettrai à disposition aucun programme pour éviter toute dérive. Penser à fermer la connexion rapidement derrière la requête, cela évitera de gacher des ressources aussi bien pour le client que le serveur...
PPS: Motion-Twin, pourquoi pas corriger rapidement ce problème ? Quoi que vu l'utilité du site... Merci pour le superbe travail sur le MTASC.
PPPS: Motion-Twin a corrigé le problème le 26 juillet 2007; soit deux jours après la diffussion du problème sur un forum et soit après 15 jours de découverte de la faille. La divulgation du problème sur le forum a engendré quelques abus.

Quelques notes perso:
Tester les variables Apache: X-Real-IP, HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, HTTP_REFERER.
Utilisation de la fonction php getenv pour recuperer les variables Apache.
Tester une injection SQL via la variable HTTP_REFERER.
Tester une attaque de la variable REMOTE_ADDR (apache/php).
Si 'register_globals' est activé, tester la reécriture de la variable via ?REMOTE_ADDR=XXX.XXX.XXX.XXX.
Tester l'injection de paquet forgé via Packet Builder