PHP一致性hash

PHP提供了两种比较两个变量的方法:

  • 松散比较使用 == or != : 两个变量都具有“相同的值”。
  • 严格比较 === or !== : 两个变量都具有“相同的类型和相同的值”。

类型杂耍

真实陈述

var_dump('0010e2'   == '1e3');           # true
var_dump('0xABCdef' == ' 0xABCdef');     # true PHP 5.0 / false PHP 7.0
var_dump('0xABCdef' == '     0xABCdef'); # true PHP 5.0 / false PHP 7.0
var_dump('0x01'     == 1)                # true PHP 5.0 / false PHP 7.0
var_dump('0x1234Ab' == '1193131');
'123'  == 123
'123a' == 123
'abc'  == 0
'' == 0 == false == NULL
'' == 0       # true
0  == false   # true
false == NULL # true
NULL == ''    # true

空语句

var_dump(sha1([])); # NULL
var_dump(md5([]));  # NULL

魔术哈希-漏洞利用

如果计算的哈希仅以“ 0e”(或“ 0..0e”)开头,后跟数字,则PHP将把哈希视为浮点数。

Hash“Magic” Number / StringMagic Hash-魔术哈希
MD5 240610708 0e462097431906509019562988736854
SHA1 10932435112 0e07766915004133176347055865026311692244
SHA-224 10885164793773 0e281250946775200129471613219196999537878926740638594636
SHA-256 34250003024812 0e46289032038065916139621039085883773413820991920706299695051332
SHA-256 TyNOQHUS 0e66298694359207596086558843543959518835691168370379069085300385

<?php var_dump(md5('240610708') == md5('QNKCDZO')); # bool(true) var_dump(md5('aabg7XSs') == md5('aabC9RqS')); var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m')); ?>


之前遇到的一个CTF实例:

 

 

 

posted @ 2020-04-02 22:01  micr067  阅读(214)  评论(0编辑  收藏  举报