弱类型语言

什么是弱类型语言

弱类型语言在定义变量时,对变量内容的类型没有明确定义,即在申明一个变量的时候,并不需要指明它保存的数据类型,如VBPHP语言

PHP弱类型实现的原理参考:php弱类型总结 作者:似水牛年

Hacking Lab解密关7WP

下面的例子均以php作为演示

弱类型造成的影响

类型未定义

  1. 如果该字符串没有包含’.',’e',’E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值

  2. 该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

  3. 遇到了0e这种情况,php会把它解析成科学计数法,由于0的n次方为0,所以返回true

  4. 遇到了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可以查看上面的参考链接

posted @ 2020-03-06 23:29  labster  阅读(414)  评论(0编辑  收藏  举报