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

PHP弱类型比较及绕过

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

字符串和数字

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

'12'==12 //true

'12abc'==12 //true

'adm2n'==0 //true

布尔值与任意值比较

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

'way'==true //true

'flase'==true //true

234==true //true

0==flase //true

hash值和字符串“0”比较

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

md5($str1)=0e420233178946742799316739797882

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

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

strcmp(str1,str2)函数

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

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

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

绕过

==绕过

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

12.0==12 true

'12'==12 true

switch绕过

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

$a='2abc';

switch($a){

case 1:

echo 111;

case 2:

echo 222;

case 3:

echo 333;

}

?>

>>222

intval()函数

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

$num=2e4

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

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

===强比较绕过

一般强比较绕过都是利用相同的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强类型比较

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。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: