CTF WEB PHP弱类型
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