php比较绕过(强比较“===”/弱比较“==“)

比较绕过(强比较/弱比较)

PHP弱类型比较及绕过

PHP的字符串和数字比较时,会将字符串先转化成数字类型在进行比较。

  1. 字符串和数字

字符串以数字开头时,以开头数字(到字母出现截止)作为转换结果;开头不是数字的字符串或空(null),则转换为0。

'12'==12    //true
'12abc'==12 //true
'adm2n'==0  //true
  1. 布尔值与任意值比较

布尔值true和任意字符串都相等,除了0。

'way'==true    //true
'flase'==true  //true
234==true      //true
0==flase       //true
  1. hash值和字符串“0”比较

因为当hash开头为0e后全为数字的话,进行比较时就会将其当做科学计数法来计算,用计算出的结果来进行比较。

md5($str1)=0e420233178946742799316739797882
md5($str2) == '0'	//true

当字符串被当作一个数值来处理时,如果该字符串没有包含’.’,‘e’,'E’并且其数值在整形的范围之内,该字符串作为int来取值,其他所有情况下都被作为float来取值,并且字符串开始部分决定它的取值,开始部分为数字,则其值就是开始的数字,否则,其值为0。

  1. strcmp(str1,str2)函数

此函数用来比较字符串。返回值:0-两字符串相等;<0- str1<str2;>0-str1>str2

(如果两个字符串不同等,但是字符串长度相同,就比较从哪一位开始不同的,然后比较那一位的大小。 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。)

但当参数为数字或数组时,返回值则会为null。

绕过

  1. ==绕过

两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。所以他比较的就只是值 ,不比较类型。

12.0==12  true
'12'==12  true
  1. switch绕过

switch()函数的参数和弱比较类似,会将参数进行转换,转换成int型值。

<?php
  $a='2abc';
switch($a){
  case 1:
		echo 111;
  case 2:
  	echo 222;
  case 3:
  	echo 333;
}
?>

>>222
  1. intval()函数

intval()函数是获取变量的整数值,但是intval()函数有个漏洞就是他也会自动获取数字,从数字开头到出现字母后停止。有是也会利用这个来进行绕过;另外intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

$num=2e4
intval($num)<2020 && intval($num+1)>2021

第一个判断取到的值为2,第二个判断会先计算加法,为20001,即可成功绕过。

  1. ===强比较绕过

一般强比较绕过都是利用相同的MD5强碰撞进行绕过。我把网上找的一些都写在这了:

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
a=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
b=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
a=0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef
b=0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef

例题:BUUCTF在线评测

请求图片参数改为index.php,获得源码,绕过命令过滤,MD5强类型比较

  1. is_numeric(mix $var)函数绕过

他是判断变量是否是数字说数字字符串的函数,只有全部为数字时才能为真,但是其漏洞是:当将变量用16进制表达时,结果都为真。

is_numeric(123)  //true
is_numeric('123') //true
is_numeric('123.0) //true
is_numeric(0x776179)  //'way'->true
is_numeric('0x776179') //flase
is_numeric('123a')//flase
is_numerric('123 ')//flase

例题:BUUCTF-Ez bypass

其中gg和id传参为上面强碰撞的第一对值,然后passwd=1234567 (注意7后面有个空格,或者写成1234567%20),以post方式请求,即可得到flag。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值