Schwach typisierte Sprachen werden auch schwach typisierte Definitionssprachen genannt. Das Gegenteil einer stark typisierten Definition. Sprachen wie VB und PHP sind schwach typisiert. In diesem Artikel erhalten Sie eine detaillierte Einführung in die Sicherheitsprobleme der schwachen Typen von PHP.
Vorwort
Ich glaube, jeder weiß, dass PHP die beste Sprache der Welt ist, und die Probleme von PHP selbst können auch als solche angesehen werden Web-Sicherheit. Zu den Merkmalen von PHP gehören die schwache Typisierung und die lockere Handhabung eingehender Parameter durch integrierte Funktionen.
In diesem Artikel werden hauptsächlich die Probleme in PHP-Funktionen beschrieben, auf die ich beim Aufbau einer offensiven und defensiven Plattform gestoßen bin, sowie die Probleme, die durch die schwachen Typen von PHP verursacht werden. Es hat einen gewissen Referenzwert für jeden, der PHP lernt oder verwendet. Schauen wir uns das unten an.
Einführung in schwache PHP-Typen
Der Herausgeber hält PHP für sehr leistungsfähig, weil PHP Entwicklern viele einzigartige Funktionen bietet verwenden, einer davon ist der schwache PHP-Typ-Mechanismus.
In PHP können Sie die folgenden Vorgänge ausführen.
$param = 1; $param = array(); $param = "stringg";
Schwach typisierte Sprachen haben keine Einschränkungen hinsichtlich des Datentyps von Variablen. Sie können Variablen jederzeit Variablen eines anderen Typs zuweisen. Gleichzeitig können Variablen auch in beliebige andere Datentypen umgewandelt werden.
Typkonvertierungsproblem
Typkonvertierung ist ein unvermeidbares Problem. Wenn Sie beispielsweise GET- oder POST-Parameter in den Typ int konvertieren müssen oder wenn die beiden Variablen nicht übereinstimmen, konvertiert PHP die Variablen automatisch. Allerdings ist PHP eine schwach typisierte Sprache, was zu vielen unerwarteten Problemen bei der Typkonvertierung führt.
Vergleichsoperator
Typkonvertierung
Im Vergleich von $a==$b
$a=null;$b=flase ; //true $a='';$b=null; //true
Es gibt viele solcher Beispiele, und diese Vergleiche sind alle gleich.
Bei der Verwendung von Vergleichsoperatoren treten auch Typkonvertierungsprobleme auf, wie folgt:
0=='0' //true 0 == 'abcdefg' //true 0 === 'abcdefg' //false 1 == '1abcdef' //true
Wenn Variablen unterschiedlichen Typs vorhanden sind Bei Vergleichen kann es zu Problemen mit der Variablenkonvertierung kommen, und nach der Konvertierung können Probleme auftreten.
Hash-Vergleich
Zusätzlich zu der oben genannten Methode gibt es auch Probleme beim Durchführen eines Hash-Vergleichs. Wie folgt:
"0e132456789"=="0e7124511451155" //true "0e123456abc"=="0e1dddada" //false "0e1abc"=="0" //true
Wenn beim Durchführen von Vergleichsoperationen eine Zeichenfolge wie 0ed+
angetroffen wird, wird diese Zeichenfolge als wissenschaftliche Zählmethode analysiert. Daher sind die Werte der beiden Zahlen im obigen Beispiel beide 0 und daher gleich. Dieses Muster ist nicht gleich, wenn 0ed+
nicht erfüllt ist. Diese Frage wird in der MD5-Kollision in der Offensiv- und Defensivplattform getestet.
Hex-Konvertierung
Es gibt auch ein Problem beim Vergleich hexadezimaler Restzeichenfolgen.
Beispiele sind wie folgt:
"0x1e240"=="123456" //true "0x1e240"==123456 //true "0x1e240"=="1e240" //false
Wenn eine der Zeichenfolgen mit 0x beginnt, analysiert PHP die Zeichenfolge in Die Dezimalzahl ist Dann wird 0x1240 in Dezimalzahlen analysiert und ergibt 123456, sodass der Vergleich mit 123456 vom Typ int und vom Typ string gleich ist. Die Schwierigkeit bei der Benennung der Offensiv- und Defensivplattform ist auf diese Eigenschaft der Inspektion zurückzuführen.
Typkonvertierung
Übliche Konvertierungen sind hauptsächlich die Konvertierung von int in string und von string in int.
int zu string:
$var = 5; 方式1:$item = (string)$var; 方式2:$item = strval($var);
string zu int: intval()
Funktion.
Für diese Funktion können Sie sich zunächst 2 Beispiele ansehen.
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0
Erklärungintval()
Bei der Konvertierung wird vom Anfang der Zeichenfolge an konvertiert, bis ein nicht numerisches Zeichen gefunden wird. Auch wenn eine Zeichenfolge erscheint, die nicht konvertiert werden kann, meldet intval()
keinen Fehler, sondern gibt 0 zurück. Die Eigenschaften von
intval()
werden in der Frage von MYSQL in der Offensiv- und Defensivplattform getestet.
Gleichzeitig sollten Programmierer beim Programmieren nicht den folgenden Code verwenden:
if(intval($a)>1000) { mysql_query("select * from news where id=".$a) }
Zu diesem Zeitpunkt Der Wert von $a kann 1002 Union sein …..
Die Lockerheit der Parameter integrierter Funktionen
Die Lockerheit integrierter Funktionen Ja, wenn Sie eine Funktion aufrufen, übergeben Sie ihr einen Parametertyp, den die Funktion nicht akzeptieren kann. Die Erklärung ist etwas verwirrend, deshalb wollen wir das Problem direkt anhand praktischer Beispiele veranschaulichen. Im Folgenden konzentrieren wir uns auf einige solcher Funktionen.
md5()
$array1[] = array( "foo" => "bar", "bar" => "foo", ); $array2 = array("foo", "bar", "hello", "world"); var_dump(md5($array1)==var_dump($array2)); //true
Die Beschreibung der Funktion md5() im PHP-Handbuch lautet string md5 ( string $str [, bool $raw_output = false ] )
, die Anforderung in md5()
ist ein String-Typ-Parameter. Wenn Sie jedoch ein Array übergeben, meldet md5()
keinen Fehler und Knowledge kann den MD5-Wert des Arrays nicht korrekt berechnen. Dies führt dazu, dass die MD5-Werte zweier Arrays gleich sind. Dieses md5()
Feature wird auch im Bypass wieder in der Offensiv- und Defensivplattform berücksichtigt.
strcmp()
strcmp()
函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 )
,需要给strcmp()
传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。
如果传入给出strcmp()
的参数是数字呢?
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。
strcmp这种特性在攻防平台中的pass check有考到。
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。如下:
$i ="2abc"; switch ($i) { case 0: case 1: case 2: echo "i is less than 3 but not negative"; break; case 3: echo "i is 3"; }
这个时候程序输出的是i is less than 3 but not negative
,是由于switch()
函数将$i进行了类型转换,转换结果为2。
in_array()
在PHP手册中,in_array()
函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
,如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle
是否在$haystack
中。当strince的值为true时,in_array()
会比较needls的类型和haystack中的类型是否相同。
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true
可以看到上面的情况返回的都是true,因为'abc'会转换为0,'1bc'转换为1。
array_search()
与in_array()
也是一样的问题。
相关推荐:
Das obige ist der detaillierte Inhalt vonDetaillierte Zusammenfassung der Sicherheitsprobleme bei schwachem PHP-Typ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!