10-08-2013, 11:45 AM
Citation :echo ${'$_GET["division_premiere_ligne_". $count .""]'}La chaine est entourée de guillemets simples ' ' et donc, au niveau de $count, ce doit être des guillemets simples, sinon, php ne fait rien du tout et affiche, tel quel " . $count . ".
Ensuite, ${...} va chercher la variable dont le nom est '...'. Ici, le nom utilisé à la place des ... est '$_POST[]', donc php cherche une variable dont le nom est $_POST[], autrement dit, il ne cherche pas $_POST[] (variable dont le nom est _POST[]) mais $$_POST[].
La syntaxe que tu cherchais est:
Code PHP :
<?php
echo $_POST["division_premiere_ligne_". $count]
Ici, PHP cherche bien la variable $_POST[] avec le nom de clef "division_premiere_ligne_". $count qui est une chaine de caractère composée d'une constante littérale (gauche) et de la valeur d'une variable (droite).
Pour l'injection, le principe est simple:
OWASP a écrit :Avant de faire n'importe quel traitement à une donnée entrante, il faut la vérifier par le biais d'une "whitelist".
En d'autres mots, avant de faire le moindre test ou manipulation d'une entrée ($_POST, $_GET, $_COOKIE, $_FILE(S?), headers HTTP, voire même les données issues de ton propre SQL ...) il faut les vérifier en ayant une liste de valeurs autorisées. La donnée doit être sur la liste des valeurs autorisées, sinon, elle doit être refusée. L'approche "blacklist" (lister les valeurs interdites et autoriser tout le reste) est souvent source de failles, l'approche whitelist est plus sécurisée.
Dans l'exemple précédent, avec ${...}, la valeur de ... venait directement du client (c'était la valeur de ton $_POST), donc je pouvait mettre n'importe quoi à la place des ... et voir la valeur de n'importe quelle variable PHP du serveur.
Il te faut donc d'abord vérifier que les valeurs de ton $_POST['attack'] sont toutes recevables et valides avant de les traiter. Pour "target", je ne sais pas quelle est ta whitelist, mais pour les "lines", je pense que tu peux transformer chaque valeur en entier, avec un cast (int), puis vérifier qu'elle est positive strictement et qu'elle ne dépasse pas la borne maximale (3 dans l'exemple précédent). Tu peux aussi faire une liste brute (array(1,2,3)) et vérifier que chaque valeur est bien strictement dedans (attention, '3' !=== 3 à cause du typage différent).