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¶m2=240610708
|
案例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>"; } ?>
|
案例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 "------"; } ?>
|
案例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; } ?>
|
案例5 strcmp
1
| strcmp(string1,string2) strcmp将string1和string2转换为ascii码相减 若返回0,代表两个字符串相等 ;若返回<0 ,代表string1 小于 string2;若返回>0,代表string1 大于 string2
|
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.."; } } ?>
|
案例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)
|
案例7 array_search
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)
|
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..'; } ?>
|