In letzter Zeit stoße ich bei CTF-Fragen häufig auf Fragen zu Schwachen PHP-Typen. Dieser Artikel gibt Ihnen hauptsächlich eine Zusammenfassung der schwachen PHP-Typen und hofft, allen zu helfen.
Einführung in das Wissen:
Es gibt zwei Vergleichssymbole == und === in PHP
<?php$a = $b ;$a===$b ; ?>
=== zum Vergleich Wann Beim Vergleich wird zunächst festgestellt, ob die Typen der beiden Zeichenfolgen gleich sind, und dann verglichen
== Beim Vergleich werden zunächst die Zeichenfolgentypen in dieselben konvertiert und dann
verglichen Wenn beim Vergleichen einer Zahl und einer Zeichenfolge oder beim Vergleichen einer Zeichenfolge mit numerischem Inhalt die Zeichenfolge in einen numerischen Wert umgewandelt wird und der Vergleich auf der Grundlage des numerischen Werts durchgeführt wird
php führt keine strenge Prüfung durch der Typ der übergebenen Variablen. Variablen können auch frei konvertiert werden.
Zum Beispiel beim Vergleich von $a == $b
$a = null; $b = false; //为真 $a = ''; $b = 0; //同样为真
Außerdem wird beim Vergleich eines numerischen Werts mit einer Zeichenfolge die Zeichenfolge in einen numerischen Wert umgewandelt
<?phpvar_dump("admin"==0); //truevar_dump("1admin"==1); //truevar_dump("admin1"==1) //falsevar_dump("admin1"==0) //truevar_dump("0e123456"=="0e4456789"); //true ?>
1. Beachten Sie den obigen Code. Wenn „admin“==0 verglichen wird, wird admin in einen numerischen Wert umgewandelt und die Konvertierung erzwungen. was natürlich gleich 0 ist.
2. „1admin“==1 wandelt 1admin beim Vergleich in einen numerischen Wert um und das Ergebnis ist 1, aber „admin1“==1 ist gleich einem Fehler, d. h. „admin1“. in 0 umgewandelt.
3 、"0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。
应当注意的是: 当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含 '.' ,'e' , 'E',并且其数值值在整形的范围之内 该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
绕过类型:
md5绕过(Hash比较缺陷)
<?php if (isset($_GET['Username']) && isset($_GET['password'])) { $logined = true; $Username = $_GET['Username']; $password = $_GET['password']; if (!ctype_alpha($Username)) {$logined = false;} if (!is_numeric($password) ) {$logined = false;} if (md5($Username) != md5($password)) {$logined = false;} if ($logined){ echo "successful"; }else{ echo "login failed!"; } } ?>
题目大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句
介绍一批md5开头是0e的字符串 上文提到过,0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。md5('240610708') == md5('QNKCDZO')成功绕过!
==南邮ctf bypass again==
打开后看到代码:
if (isset($_GET['a']) and isset($_GET['b'])) {if ($_GET['a'] != $_GET['b'])if (md5($_GET['a']) == md5($_GET['b']))die('Flag: '.$flag);elseprint 'Wrong.'; }
源码要求提交两个不相等的值使他们的md5值严格相等。md5()函数要求接收一个字符串,若传递进去一个数组,则会返回null,即var_dump(md5(array(2))===null);值为bool(true)
可以向$_GET数组传入两个名为a、b的不相等的数组,从而导致md5()均返回空,于是得到flag。 构造url:http://chinalover.sinaapp.com/web17/index.php?a[]=0&b[]=1 json绕过
<?phpif (isset($_POST['message'])) { $message = json_decode($_POST['message']); $key ="*********"; if ($message->key == $key) { echo "flag"; } else { echo "fail"; } } else{ echo "~~~~"; } ?>
输入一个json类型的字符串,json_decode函数解密成一个数组,判断数组中key的值是否等于 $key的值,但是$key的值我们不知道,但是可以利用0=="admin"这种形式绕过
最终payload message={"key":0}。
strcmp漏洞绕过
<?php $password="***************" if(isset($_POST['password'])){ if (strcmp($_POST['password'], $password) == 0) { echo "Right!!!login success";n exit(); } else { echo "Wrong password.."; } ?>
strcmp是比较两个字符串,如果str1
我们是不知道$password的值的,题目要求strcmp判断的接受的值和$password必需相等,strcmp传入的期望类型是字符串类型,如果传入的是个数组会怎么样呢
我们传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等
payload: password[]=xxx
相关推荐:
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der schwachen PHP-Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!