php弱类型

php弱类型:

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等
== 在进行比较的时候,会先将字符串类型转化成相同,再比较值
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

$a="123";@$b=123;
ab; TRUE
a
=b; FALSE
0' '; TRUE
'1111'
TRUE; TRUE
'0''false'; false
'0'
false;true
0x01=1; FLASE
0x01=TRUE; TRUE
[0]=[NULL]; TRUE

NULL=FALSE; TRUE
0e123465==0e5555555; TRUE (0e绕过)

案例1 md5弱比较

方法1 0e绕过(0e 科学计数法)
方法2 md5处理数组的时候会返回null的值,可以传递两个数组进去使得null==null
<?php
ini_set("display_error",false);
error_reporting(0);
if($_POST['param1']!=$_POST['param2']&&md5($_POST["param1"])==md5($_POST['param2']))
{
	die("success");
}
else
{
	echo "fail";
}

?>
param1=QNKCDZO&param2=240610708 //0e绕过 success

案例2 sha1弱类型

方法1 0e绕过(0e 科学计数法)
方法2 sha1处理数组的时候会返回null的值,可以传递两个数组进去使得null==null
<?php
ini_set("display_error",false);
error_reporting(0);
$flag ="flag";

if(isset($_GET['name']) && isset($_GET['password']))
{
	if($_GET['name'] == $_GET['password'] )
		echo '<p>Your password can not be your name</p>';
	else if (sha1($_GET['name']) === sha1($_GET['password']))
		die('FLAG:'.flag);
	else 
		echo '<p>Invalid password.</p>';
}
else
{
	echo "<p>Login first!</p>";
}
?>
?name[]=1&password[]=2 //md5和sha1无法处理数组传入会返回NULL NULL

案例3 json相关

==号在比较字符串和数字的时候会将字符串转换成数字再进行比较
"1234abcd" == 1234 true
"123abc" == 123 true
"abcd" == 0 true
字符串连续前几位是数字的话就会取这几位为转换的结果
<?php
ini_set("display_error",false);
error_reporting(0);
$flag ="flag";
$key = "adminasdasdasd";
if(isset($_GET['message']))
{
	$message = json_decode($_GET['message']);
	if($message->key ==$key)
	{
		echo flag;
	}
	else
	{
		echo "fail";
	}
}
else
{
	echo "------";
}
?>
?message={"key":0} //"adminasdasdasd"字符串和数字进行比较的时候会转换成数字
//"adminasdasdasd"转换成数字为0

案例4 switch

switch在比较的时候会将字符串转换成数字,转换方法参考上面
<?php
highlight_file(__FILE__);
$i ="3name";
switch ($i){
	case 0:
	case 1:
	case 2:
		echo "this is two";
		break;
	case 3:
		echo "flag";
break;
}
?>
//echo flag switch case数字的时候强制把"3name"转换成数字进行比较,字符串开头包括什么数字就会转换成什么数字

案例5 strcmp

strcmp(string1,string2)	strcmp将string1和string2转换为ascii码相减 若返回0,代表两个字符串相等 ;若返回<0 ,代表string1 小于 string2;若返回>0,代表string1 大于 string2
strcmp在比较字符串和数组的时候会返回0
<?php

highlight_file(__FILE__);
include "flag.php";
$password="asdasdad";
if (isset($POST['password'])){
    if (strcmp($_POST['password'],$password)==0) {
        echo "Right!!!login success";
        echo $flag;
        exit;
    }
    else{
        echo "Wrong password..";
    }
}
?>
password[]=1

案例6 in_array

<?php

highlight_file(__FILE__);
$array = [0, 1, 2, '3'];
var_dump(in_array('abc', $array));
var_dump(in_array('1bc', $array));
var_dump(in_array(3, $array));

?>
 运行结果bool(true) bool(true) bool(true) 
<?php
highlight_file(__FILE__);
$array = [0, 1, 2, '3'];
var_dump(array_search('abc', $array));
var_dump(array_search('1bc', $array));
var_dump(array_search(3, $array));
var_dump(array_search('3', $array));
?>
 int(0) int(1) int(3) int(3)  

变量覆盖extract

extract(); 将输入内容导入符号表,会存在变量覆盖
<?php
highlight_file(__FILE__);
include "flag.php";
extract($_GET);
if (isset($gift)){
	$content = trim(file_get_contents($flag));
		if ($gift == $content) {
		echo $flag;
	}
}
else{
	echo 'oh..';
}
?>
?gift=&content=
posted @ 2023-06-01 00:30  nyyyddddn  阅读(45)  评论(0编辑  收藏  举报