JeuWeb - Crée ton jeu par navigateur
Problème de piratage - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Problème de piratage (/showthread.php?tid=3631)

Pages : 1 2 3


RE: Problème de piratage - phenix - 03-02-2009

Citation :Ce qui est sûr, ne jamais laisser en prod des "or die (mysql_error())"

Je suis en bêta test :hahahaha:

Citation :À tout hasard, est-ce que tes magic quotes sont activés ? Si oui, ça explique peut-être la vulnérabilité de ton application puisqu'elles interfèrent avec mysql_real_escape_string().

Elle était désactivé, mais peut être ma ton fait la blague de les réactiver... je vérifie.

en direct du phpinfo:
magic_quotes_gpc On On

Bon, comment on désactive cette connerie.


RE: Problème de piratage - wild-D - 03-02-2009

(03-02-2009, 12:08 AM)phenix a écrit :
Citation :Ce qui est sûr, ne jamais laisser en prod des "or die (mysql_error())"

Je suis en bêta test :hahahaha:

... en même temps c'est qui qui intitule son post : "pb de piratage" ?

après chacun traduit "prod" comme y veux; mais perso un serveur tout public c'est automatiquement prod. (qu'il héberge un site en alpha, beta, gamma, v1, v2, v3... pamplemousse ^^)


pour les magic_quotes -> php.ini
et sinon ben faudra faire à la mimine le retrait des magic_quote, car ça c'est un truc qui est effectué avant l'exécution de ton script


RE: Problème de piratage - Sephi-Chan - 03-02-2009

La solution la plus simple est de désactiver les magic quotes à l'aide d'un .htaccess contenant le code :
Code :
php_flag magic_quotes_gpc Off

Sinon, tu peux te faire une fonction secureString qui… sécurisera tes chaînes, et cela sans être dérangé par les magic quotes.
fuction secureString($string){
if(get_magic_quotes_gpc() === 1){
return mysql_real_escape_string(stripslashes($string));
}
return mysql_real_escape_string($string);
}

Mais peut-être que la faille n'est pas là. Cela dit, ce sujet est une très bonne démonstration qui montre que l'utilisation d'une fonction personnalisée ou mieux, d'une classe (qui étend PDO, par exemple). Ça fait un exemple concret de plus pour expliquer l'intérêt des fonctions et de l'objet. Smile

Tu n'as plus qu'à écrire une fonction (genre query($string)) qui prend en argument une chaîne (la requête), écrit dans un fichier que l'utilisateur X (son id est récupéré depuis la session) a effectué la requête donnée puis qui retourne mysql_query($string) avec la requête demandé.


Sephi-Chan


RE: Problème de piratage - Argorate - 03-02-2009

C'est pas bête, merci de m'y faire penser!

Pour l'instant j'ai pas mis le jeu en ligne donc j'ai aucun soucis, mais je sais pas si j'aurais pensé a enlever tous les mysql_error(), surtout que j'aime bien les garder, je trouve ça pratique. ^^

Donc je pense que je ferais comme Wells ma conseillé (en aparté), je vais créer ma propre fonction, qui retourne un message d'erreur personnalisé pour les utilisateurs et le mysql_error() pour moi même. Wink


RE: Problème de piratage - Amrac - 03-02-2009

Pour trouver le gars qui te cause problème, en début de page tu scan tout tes $_GET et $_POST et tu y cherche une quelconque instruction SQL: SELECT, UPDATE, INSERT, WHERE

Vite fait et non testé, je te propose ce bout de code:
Code PHP :
<?php 
foreach($_POST as $index => $valeur)
{
if(
pregmatch('#UPDATE#',$valeur) OR pregmatch('#SELECT#',$valeur) OR
pregmatch('#INSERT#',$valeur) OR pregmatch('#WHERE#',$valeur)
)
{
//Cas typique ou il y a tentative d'injection.
//Je te conseil de t'envoyer un message (ou email) avec comme information:
//L'identifiant session du joueur (pour toi le retrouver), et une string du style "Mon trou de sécurité est dans la variable _POST[$index] = valeur dans la page $_SERVER[SCRIPT_NAME]"
}

}

Voila grossomodo, biensure pour le $_GET c'est un copier/coller et tu remplace _POST par _GET.

La, tu es certain de trouver a la fois le bonhomme et le script foireux.

Je te conseil d'étudier quelque jour comment il procède, notamment pour voir s'il y a plusieurs trou de sécurité. Etant donné que tu est en béta, c'est une bonne occasion pour sécurisé ton script.


RE: Problème de piratage - pascal - 03-02-2009

je déconseille l'envoi de mail en cas de détection, c'est très risqué (engorgement de la messagerie, tout ça...).

un log de la requête et des infos, c'est l'idéal. ha oui, dans le if, ajoute un truc pour arrêter l'exécution du script.

sinon il faut aussi vérifier que les accès à phpmyadmin sont bien sécurisés.

A+

Pascal


RE: Problème de piratage - phenix - 04-02-2009

Alors, quelques nouvelles:

J'ai placé ce script en premier truc à exécuter:
Code PHP :
<?php 
//Kill magic Quote
if (get_magic_quotes_gpc())
{
function
stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return
$value;
}

$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

C'est le code qui est dans php.net pour désactivé les magic quote.

Ensuite, j'ai grillé le perso du pirate, la dernière fois, il en avait recrée un autre, mais depuis, plus de nouvelle.
Code PHP :
<?php 
foreach($_POST as $index => $valeur)
{
if(
pregmatch('#UPDATE#',$valeur) OR pregmatch('#SELECT#',$valeur) OR
pregmatch('#INSERT#',$valeur) OR pregmatch('#WHERE#',$valeur)
)
{
//Cas typique ou il y a tentative d'injection.
//Je te conseil de t'envoyer un message (ou email) avec comme information:
//L'identifiant session du joueur (pour toi le retrouver), et une string du style "Mon trou de sécurité est dans la variable _POST[$index] = valeur dans la page $_SERVER[SCRIPT_NAME]"
}

}

C'est vraiment pas con comme truc, avec sa il y a même moyen de coupé totalement les possibilité d'envoyer des requêtes. Par contre, je rajouterais bien SHOW, TABLE, DROP, TRUNCATE. Je rejouterais également un i car on peux passer des requête en minuscule si on veux.

Il n'y a pas moyen de prendre un array comme paramètre ? Je vais me renseigné, mais sa peu être un bon moyen de ce protéger.


RE: Problème de piratage - Allwise - 04-02-2009

Pour utiliser un tableau, tu peux faire un truc du style

Code PHP :
<?php 
$crapuleux
= array('insert', 'update', 'where');

if (
preg_match('#('.implode('|', $crapuleux).')#i', $valeur))

Et le pirate il va se faire taper sur les doigts alors ? Big Grin


RE: Problème de piratage - Sephi-Chan - 04-02-2009

C'est très bourrin comme façon de protéger.
Je te conseille de revoir ton code et de protéger les valeurs qui doivent l'être (les chaînes de caractères) et de contrôler les données qui entrent dans tes scripts. Idéalement, désactive les magic quote via un fichier .htaccess.


Sephi-Chan


RE: Problème de piratage - phenix - 04-02-2009

Citation :C'est très bourrin comme façon de protéger.

Ouais, en plus sa empêche certain mots d'être écrit dans un profile par exemple: "selection"...

M'enfin, pour le moment, j'ai plus de problème, il est revenu sur le site, a laissé un message sur le forum, mais la base de donnée est intacte.

Peut être la faute au magic quote :heuuu:

Citation :Je te conseille de revoir ton code et de protéger les valeurs qui doivent l'être (les chaînes de caractères) et de contrôler les données qui entrent dans tes scripts.

Sa fait un bon moment que je fais sa, j'ai pas corrigé grand chose, vu que je mes des mysql_real_escape_string sur toutes les variables qui sont destinée a faire des requêtes depuis le début du codage... Utilisé les magic quote + mysql_real_escape_string c'est vraiment exploitable pour faire des injections ?

Citation :Idéalement, désactive les magic quote via un fichier .htaccess.

Malheureusement cela ne semble pas marcher. Et puis, je devrais mettre ce fichier .htaccess dans tout mes répertoires ou bien un seul à la racine suffit ?

En tout cas, merci de votre aide, sa fait plaisir de ce sentir soutenu ^^