freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CTF知识点: 关于PHP运算符=== 与==的总结
2022-02-06 22:47:24
所属地 河南

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来绕过

图片.png

0x03

图片.png

以下是收录的一些 0e开头的字符串 md5加密后仍为0e开头的一些md5值

图片.png

0x04

当要求 $a==$b 且 md5($a)≠ md5($b)时可以考虑使用浮点精度绕过

图片.png

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
# php安全 # MD5碰撞 # php代码审计 # CTF解题技能
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者