Vor einiger Zeit habe ich ein Thema auf der Network Attack and Defense Platform der Nanjing University of Posts and Telecommunications verfasst. Nachdem ich einen Artikel geschrieben habe, muss ich ihn noch zusammenfassen. Da es sich bei den Fragen ausschließlich um Web-Fragen handelt und alle Fragen mit PHP geschrieben wurden, werden bei vielen Fragen herkömmliche Schwachstellen wie SQL-Injection und XSS nicht untersucht. Viele davon sind Probleme mit der Syntax von PHP selbst. Da PHP derzeit die beste Sprache der Welt ist, können auch Probleme mit PHP selbst als Aspekt der Websicherheit gezählt werden. Zu den Merkmalen von PHP gehören die schwache Typisierung und die lockere Handhabung eingehender Parameter durch integrierte Funktionen. In diesem Artikel geht es hauptsächlich darum, die Probleme in den PHP-Funktionen aufzuzeichnen, 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.
Einführung in schwache PHP-Typen
$param = 1; $param = array(); $param = "stringg";Schwach typisierte Sprachen haben keine Einschränkungen hinsichtlich des Datentyps von Variablen. Sie können Variablen jederzeit jedem anderen Variablentyp zuweisen und die Variablen können auch in jeden anderen Variablentyp konvertiert werden Daten.
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.Vergleichsoperatoren
Typkonvertierung
in $a==$ In Beim Vergleich von b gibt es viele Beispiele für$a=null;$b=flase ; //true$a='';$b=null;//true, und diese Vergleiche sind alle gleich. Bei der Verwendung von Vergleichsoperatoren treten auch Typkonvertierungsprobleme auf, wie folgt:
0=='0'//true0 == 'abcdefg'//true0 === 'abcdefg'//false1 == '1abcdef'//trueWenn Variablen unterschiedlichen Typs verglichen werden, kann es zu Problemen bei der Variablenkonvertierung kommen .
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" //trueWenn beim Durchführen von Vergleichsoperationen eine Zeichenfolge wie 0ed angetroffen wird, wird diese Zeichenfolge in wissenschaftliche Notation 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.
Hexadezimale Konvertierung
Es gibt auch ein Problem beim Vergleich hexadezimaler Restzeichenfolgen. Beispiele sind wie folgt:"0x1e240"=="123456"//true "0x1e240"==123456//true "0x1e240"=="1e240"//falseWenn einer der Strings mit 0x beginnt, analysiert PHP den String in eine Dezimalzahl und vergleicht ihn dann. Wenn 0×1240 in eine Dezimalzahl geparst wird, ist es 123456 ist dasselbe wie int. Die 123456 Vergleiche zwischen Typen und String-Typen sind alle gleich. 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 to string:$var = 5;Methode 1: $item = (string)$var;
Methode 2: $item = strval($var);
var_dump(intval('2'))//2 var_dump(intval('3abcd'))//3 var_dump(intval('abcd'))//0Erklärt, dass beim Konvertieren von intval() vom Anfang der Zeichenfolge an konvertiert wird, bis ein nicht numerisches Zeichen gefunden wird. Selbst wenn eine Zeichenfolge vorhanden ist, die nicht konvertiert werden kann, meldet intval() keinen Fehler, sondern gibt 0 zurück. Diese Funktion von intval() wird in der Frage von MYSQL auf der offensiven und defensiven Plattform 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 kann der Wert von $a 1002 Union sein...
Die Lockerheit der Parameter integrierter Funktionen
$array1[] = array( "foo" => "bar", "bar" => "foo", ); $array2 = array("foo", "bar", "hello", "world"); var_dump(md5($array1)==var_dump($array2));//trueDie Beschreibung der md5()-Funktion im PHP-Handbuch lautet string md5 ( string $str [, bool $raw_output = false ] ), in md5( ) Muss ein String-Typ-Parameter sein. 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. Diese Funktion von md5() wird auch in der Angriffs- und Verteidigungsplattform wieder als Bypass berücksichtigt. strcmp()Die Funktion strcmp() wird im offiziellen PHP-Handbuch als int strcmp ( string $str1 , string $str2 ) beschrieben, und zwei String-Typen müssen an strcmp übergeben werden ()-Parameter. Wenn str1 kleiner als str2 ist, wird -1 zurückgegeben, bei Gleichheit wird 0 zurückgegeben, andernfalls wird 1 zurückgegeben. Der Kern der Funktion strcmp zum Vergleichen von Zeichenfolgen besteht darin, zwei Variablen in ASCII umzuwandeln, dann eine Subtraktionsoperation durchzuführen und dann den Rückgabewert basierend auf dem Operationsergebnis zu bestimmen. Was passiert, wenn der an strcmp() übergebene Parameter eine Zahl ist?
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。Strcmp ist eine Funktion, die im Pass-Check der Angriffs- und Verteidigungsplattform getestet wurde. switch()Wenn es sich bei switch um einen numerischen Typ handelt, konvertiert switch die Parameter in den Typ int. Wie folgt:
$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"; }Zu diesem Zeitpunkt ist die Programmausgabe i kleiner als 3, aber nicht negativ. Dies liegt daran, dass die Funktion switch() eine Typkonvertierung für $i durchführt und das Konvertierungsergebnis 2 ist . 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()也是一样的问题。