N-PN White-Hat Project
bypass is_numeric() - Version imprimable

+- N-PN White-Hat Project (https://n-pn.fr/forum)
+-- Forum : Questions (https://n-pn.fr/forum/forumdisplay.php?fid=11)
+--- Forum : Hacking (https://n-pn.fr/forum/forumdisplay.php?fid=29)
+--- Sujet : bypass is_numeric() (/showthread.php?tid=3556)



bypass is_numeric() - MLT - 16-01-2014

Bonjour,

Je me suis fait un code poreux à l'injection sql, j'ai rajouté la fonction is_numeric().

Voici le code:
Code PHP :
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test''root''');
}
catch (
Exception $e)
{
        die(
'Erreur : ' $e->getMessage());
}


$requete $_GET['id'];

if (!
is_numeric($requete))
{
echo 
"fuck you" ;

}
else
{
$reponse $bdd -> query("SELECT * FROM jeux_video WHERE id = $requete");

while (
$donnees $reponse->fetch())
{
?>
    <p>
    <strong>Jeu</strong> : <?php echo $donnees['nom']; ?><br />
    Le possesseur de ce jeu est : <?php echo $donnees['possesseur']; ?>, et il le vend à <?php echo $donnees['prix']; ?> euros !<br />
    Ce jeu fonctionne sur <?php echo $donnees['console']; ?> et on peut y jouer à <?php echo $donnees['nbre_joueurs_max']; ?> au maximum<br />
    <?php echo $donnees['possesseur']; ?> a laissé ces commentaires sur <?php echo $donnees['nom']; ?> : <em><?php echo $donnees['commentaires']; ?></em>
   </p>
<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête
}
?>

D'après une discussion sur irc hier avec quelques membres, apparemment il serait possible de bypass la fonction is_numeric().

Donc j'ai essayé d'exploiter ma faille sql avec mon code protégé par is_numeric().

Mais là j e bloque je sais pas comment faire. Tout d'abord, j'ai tenté d'injecter un ' avec id=1 0x27 mais l'id est traduit par 49, la valeur décimale de 0x27 et non par '.

Ma question est donc : Est-il possible de bypass ce code ? Big Grin

Pour info j'ai pris la bdd du site du zero , dispo dans le tuto php/sql.


RE: bypass is_numeric() - Booster2ooo - 17-01-2014

Je vais contourner la question car je ne connais pas la réponse. Tu travailles ici avec PDO alors pourquoi ne pas utiliser les requêtes préparées, qui, il me semble, ne sont pas sujettes aux injections?


RE: bypass is_numeric() - Hypnoze57 - 17-01-2014

is_numeric vérifie que la variable est bien du type numérique, pour convertir une variable en int on peut utilisé intval:

Code :
<?php
$var = intval($_GET['id']);
...mysql_query("")...
?>

Et pour répondre à ta question je n'ai jamais vu une méthode permettant de contourner ceci.


RE: bypass is_numeric() - gruik - 17-01-2014

(17-01-2014, 13h49)Hypnoze57 a écrit : is_numeric vérifie que la variable est bien du type numérique

yep, c'est même marqué directement dans la doc, suffit de regarder l'exemple, du coup c'est pas un bypass c'est juste savoir coder finalement


RE: bypass is_numeric() - Hypnoze57 - 17-01-2014

(17-01-2014, 14h43)gruik a écrit : yep, c'est même marqué directement dans la doc, suffit de regarder l'exemple, du coup c'est pas un bypass c'est juste savoir coder finalement

C'est même marqué directement dans son nom :p
Je sors -->[]


RE: bypass is_numeric() - MLT - 17-01-2014

je sais bien à quoi sert is_numeric()

mais 'or 1=1 -- = 0x276f7220313d31202d2d et c'est bien une valeur numérique Smile

Si on injecte ceci : fichier.php?id=0x276f7220313d31202d2d, sa contourne bien la fonction mais d'après mes tests, derrière ça à pas l'air de poutrer la requête sql

comme je le disais dans mon premier post, par exemple si on prend le 'simple quote'

' = 27 en hexa et 39 en décimal

si on injecte 0x27 , c'est traduit en 39 et non pas en caractère '


RE: bypass is_numeric() - Hypnoze57 - 18-01-2014

edit (reformuler): 0x276f7220313d31202d2d = de l'hexa, le type numéric accepte l'hexa mais je ne pense pas qu'sql va le decoder pour l'executer mais plutot l'executer tel qu'elle.


RE: bypass is_numeric() - gruik - 18-01-2014

(17-01-2014, 19h56)Hypnoze57 a écrit : C'est même marqué directement dans son nom :p

Code PYTHON :

>>> print u'42'.isnumeric()
True
>>> print u'0x90'.isnumeric()
False
>>> print '42'.isdigit()
True
>>> print '0x90'.isdigit()
False
 


python a écrit :The method isnumeric() checks whether the string consists of only numeric characters.
The method isdigit() checks whether the string consists of digits only.
php a écrit :Détermine si la variable donnée est de type numérique (...) Les notations hexadécimale (...), binaire (...), octale (...) sont également autorisées

faut se méfier du nom et se fier à la doc Wink (bon ok dans le cas de php faut surement plutôt se méfier du langage directement...)


RE: bypass is_numeric() - MLT - 18-01-2014

D'après mes recherches, on peut pas contourner is_numeric() en php.

c'est isnumeric() en sql que l'on peut contourner. http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html


RE: bypass is_numeric() - gruik - 18-01-2014

(18-01-2014, 13h44)MLT a écrit : c'est isnumeric() en sql que l'on peut contourner.

d'après ce que je lis la fonction n'est dispo qu'en T-SQL et donc à priori uniquement sous Microsoft SQL Server, ça me semblait important de le préciser...