CTF知识点: 关于PHP运算符=== 与==的总结
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
0x01
php中有两种比较的符号 == 与 ===
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等
== 在进行比较的时候,会先将字符串类型转化成相同,再比较值是否相等
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
1 <?php
2 var_dump("admin"==0); //true
3 var_dump("1admin"==1); //true
4 var_dump("admin1"==1) //false
5 var_dump("admin1"==0) //true
6 var_dump("0e123456"=="0e456789"); //true
7 ?> //
上述代码可自行测试
1 观察上述代码,"admin"==0 比较的时候,会将admin转化成数值,强制转化,由于admin是字符串,转化的结果是0,自然和0相等
2 "1admin"==1 比较的时候会将1admin转化成数值,结果为1,而“admin1“==1 却等于错误,也就是"admin1"被转化成了0,为什么呢??
因为在转化前会识别第一个字符,第一个字符是数字那么就会把该字符串当成数字,该字符串后面的字符会被忽略,如果字符串的第一个字符不是数字,那么就会将该字符串强制转换成数值。所以我们发现"1admin"==1 比较的结果是ture,而“admin1“==1 比较的结果是false
3 "0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等,此类弱比较缺陷,往往用来绕过一些md5加密以0e开头的字符串的比较
0x02
对于严格的比较类型,我们可以利用md5函数处理数组类型会返回false的特性,从而利用false=false来绕过
0x03
以下是收录的一些 0e开头的字符串 md5加密后仍为0e开头的一些md5值
0x04
当要求 $a==$b 且 md5($a)≠ md5($b)时可以考虑使用浮点精度绕过
0x05
当要求
(string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])
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
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐