什么是弱类型语言
弱类型语言在定义变量时,对变量内容的类型没有明确定义,即在申明一个变量的时候,并不需要指明它保存的数据类型,如VB
、PHP
语言
PHP弱类型实现的原理参考:php弱类型总结 作者:似水牛年
下面的例子均以php
作为演示
弱类型造成的影响
类型未定义
如果该字符串没有包含’.',’e',’E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值
该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
遇到了0e这种情况,php会把它解析成科学计数法,由于0的n次方为0,所以返回true
遇到了0x情况,php会解析成16进制
<?php
var_dump("abc" == 0); // bool(true)
var_dump("1ab" == 1); // bool(true)
var_dump("ab1" == 1); // bool(false)
var_dump("0e12" == "0e32"); // bool(true)
var_dump("0x1046a" == "66666"); //bool(true)
?>
函数返回值相同
md5(),如果两个MD5返回值为0e开头的字符串,就会触发弱类型,即两个值相等
最经典的就是这两个字符串
var_dump(md5('240610708') == md5('QNKCDZO')); //bool(true)
// md5('240610708') = 0e462097431906509019562988736854
// md5('QNKCDZO') = 0e830400451993494058024219903391
数组绕过,MD5要求只能传入字符串,如果传入数组,就会返回NULL
var_dump(),接收数组后也是会返回NULL
所以这里可以利用 === ,进行绕过
$array1 = [1,3,5];
$array2 = [6,8,9];
# 注意括号
var_dump( md5($array1) === var_dump($array2) ); //bool(true)
CTF题实例
HackingLab解密关7
原题md5
真的能碰撞嘛?
分值: 350
md5真的能碰撞嘛?其实有时候我们不需要进行碰撞得到完全一致的MD5 通关地址
WP可以查看上面的参考链接