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¶m2=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)
案例7 array_search
<?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=