一、PHP弱类型说明
1.简介
php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换。
在php中有两种比较符号: 一种是 ==,另外一种是 ===,都是用来比较两个数值是否相等的操作符,但他们也是有区别的:
== :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。简单的说,它不会比较变量类型,只比较值。
=== :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型。
2.PHP转换规则
若一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较。若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串(例如"aaa"是不能转换为数字的字符串,而"123"或"123aa"就是可以转换为数字的字符串)或null,则转换为0;例如:
var_dump(12=="12") // true
var_dump(12=="12aa") //true
var_dump( "admin"==0) //true
var_dump(false==""==0==NULL) //true
布尔值true和任意字符串都弱相等。例如:
var_dump(true=="afa") //true
数字和“e"开头加上数字的字符串(例如"1e123”)会当作科学计数法去比较;
0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0;
当字符串被当作一个数值来处理时,如果该字符串没有包含’.’,‘e’,'E’并且其数值在整形的范围之内,该字符串作为int来取值,其他所有情况下都被作为float来取值,并且字符串开始部分决定它的取值,开始部分为数字,则其值就是开始的数字,否则,其值为0。
二、题目讲解
1.md5弱相等绕过方法
题目链接:
NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem/386
题目核心描述
if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
if ($name != $password && md5($name) == md5($password))
值不相等md5加密后弱相等
给出一组值,还有很多的类似值可以去网上找
s878926199a
s155964671a
或者数组绕过
name[]=1
password[]=1
2.md5强相等绕过方法
数组表达式绕过
name[]=1
password[]=1
注意:
ffifdyop经过md5加密,表示的16进制转换为ASCII是or。当万能密钥使用
题目
NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem/713
3.变量转换为字符串md5强相等绕过方法
字符串不相等,md5的强类型相等string($a)!=string($b),md5($a)===md5($b)
array1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&=&array2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2&=
注意传参的后面加上&=
4.上传的参数字符串且md5弱相等
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2']))
科学技术法绕过
s878926199a
s155964671a
题目链接
https://www.nssctf.cn/problem/2076