关于强比较与弱比较的区别
关于强类型比较与弱类型比较区别
== 弱类型比较
1 | 与数字进行比较时,从数字开始截断至遇到第一个字母 |
弱类型只会比较参数的值(传入参数时,会将参数转化为同一类型),也就是说,如果是md5($a)==md5($b)
,那么传入的a、b只会比较转化为md5后的值,此时可以有以下绕过:
- 传入数组,因为在传入数组时,md5函数会直接返回false,false=false成立
- 传入的字符串md5加密后为0e……,在进行弱比较时,将0e……转化为数字后,会被认为是科学计数法,而0e……的科学计数法表示的数为0,也就是0==0成立
=== 强类型比较
强类型比较不仅会比较参数的值,还会比较参数的类型,也就是说,如果是md5($a)===md5($b)
,那么传入的a、b会比较转化为md5后的字符串,此时可以有以下绕过:
传入数组,理由同弱比较
传入md5值相同的字符串,进行md5强碰撞:
1
2
3
4
5
6
7
8a=%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
sha1($a)===sha1($b),可构建两个SHA-1值相同但不一样的pdf文件1.pdf和2.pdf:
1 | a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1 |
如果遇到substr(md5($a),0,x)==="某一字符串"
,这时候意思就是$a的md5值的前x个字符等于这个字符串,可以写脚本进行md5碰撞:
1 | import hashlib |
与强弱类型比较相似的函数
strcmp函数,比较两字符串,相同返回0,与强类型比较相似
由于此函数只能比较字符串,当传入数字或数组时,会直接返回null,形成0==0。
switch函数,传入值时会将值转化为整数类型,与弱比较类型相似
1 |
|
intval函数
自动从首项开始,截止到一个整数,与弱类型比较相似,但如果传入的参数是一个表达式,会优先计算表达式:
1 |
|
is_numeric函数
判断是否为数字字符串,若将非数字字符串转化为16进制数,也会被认为是数字
1 | is_numeric(111) //true |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Six_plum!