PHP弱类型

在PHP中,可能会需要比较两个值或者变量是否相等,可以使用""和"="来完成比较,但是他们之间存在一定的差别

“==”操作符

var_dump("4" == 4);
//true

在使用“==”进行比较时,PHP会将字符串转化为同类型再进行比较

“===”操作符

var_dump("4" === 4);	
//false

在使用“===”进行比较时,PHP会先判断类型是否相等,再进行比较

例子

<?php
    var_dump("admin" == 0);		//true
	var_dump("1admin" == 1);	//true
	var_dump("admin1" == 1);	//false
	var_dump("admin1" == 0);	//true
	var_dump("admin1" == 0);	//true
	var_dump("0e123" == "0e456")//true
?>

在PHP进行类型转换的时候,会从字符串第一位依次向后判断是否为数字,如果true则保留,false结束判断

"admin" -> 0

第一位不为数字而是字母,所以判断结束,值为int的初始值0

"1admin" -> 1

第一位为数字保留,第二位不是数字,结束判断,值为1

"123a456789" -> 123

在判断到不为数字的位时,结束判断,所以后面的值不在进行判断

"0e123" -> 0

此字符串属于特殊字符串,为科学计数法的表达方式,所以会被转化为具体数值 0*10^123 = 0

<?php
    var_dump(1 + "1.5");		//2.5
	var_dump(1 + "-1.3e3");		//-1299
	var_dump(1 + "src123e5");	//1
	var_dump(1 + "2admin");		//3
	var_dump(1 + "admin2");		//1
?>

当字符串中没有包含‘.’、‘e’、'E',且值小于int范围,会被作为int来取值,其余情况会作为浮点数来取值

案例

<?php
    if(isset($_POST['message'])){
        $message = json_decode($POST['message']);
        $key = "******";  //保密
        if($message->key == $key){
            echo "flag";
        }
        else{
            echo "fail";
        }
    }
	else{
        echo "~~~";
    }
?>

在上述案例中,已知有POST参数message,通过传入的值和变量key做比较,相等时得到flag

变量Key中的值我们不知道,但是它的类型为字符串,并且使用‘’==‘做判断符,所以我们猜测一下此字符串中第一位不包含数字,不包含数字的话做类型转换就是0,所以我们POST传入一个整形0得到flag

POST:

message={"key":0}

如果字符在转换后不是0是数字呢?可以采用脚本爆破的方式从1到9999全部试一遍,得到flag