弱比较与强比较
弱比较(松散比较“==”)
如果在php代码中出现数字之间比较是否相等的情况,并且使用的是“==“的弱比较方式,那么可以使用以下方法代替
例子
1 | var_dump(123=='123asd');//输出为true |
原因:在php中遇到数字与字符串进行松比较时,会将字符串中前几位是数字且数字后面不是”.“,”e“或”E“的转换为数字,与数字进行比较,相同则返回true,不同则返回false,后面的字符串直接截断扔掉。
1 | var_dump(123==‘123.5asd1234’);//输出为false |
1 | //假设需要$username == 'abcdef'或者一个不知道的字符串,那么可以直接令$username = true即可 |
实例
要使一个纯数字与纯字母的字符串的md5值相同,判断比较使用的是“==”,可以利用一下弱比较的漏洞。
看一下md5()函数
1 | string md5 ( string $str [, bool $raw_output = false ] ) |
str原始字符串。raw_output如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。
16进制的数据中是含有e的,可以构建使得两个数字比较的,这里有一个现成的例子:
1 | md5(‘240610708’) |
可以看到,这两个字符串一个只包含数字,一个只包含字母,虽然两个的哈希不一样,但是都是一个形式:0e 纯数字这种格式的字符串在判断相等的时候会被认为是科学计数法的数字,先做字符串到数字的转换。
—意思就是说上面的两个字符串在进行MD5转换之后并进行弱比较的话是相等的(都会被转换为0)
强比较(“===”)
md5和sha1都需要强相等
1 | ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a) === sha1($this->b)) |
题目没有对数组进行限制
强比较无法识别数组类型,所以加入要使
1 | $_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']) |
那么可以使用以下语句
1 | param1[]=1¶m2[]=2 |
题目要求必须是字符串(md5碰撞绕过)
payload原理:原本payload字符串中含有多种空白符号,MD5加密后hash值相等(空白符号不影响md5值)。但是我们上传参数时会自动进行一次url解码,这样过后因为空白字符两个url就不相等了,从而成功绕过。
1 | 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 |
题目要求除了是字符串之外,还需要是指定前缀的字符串
观察下面的代码:
1 |
|
需要找到前缀都是$master但不相同,而他们的md5值又相同的值。
先用fastcoll找出这两个值。
1 | import requests # 导入requests库,用于发送HTTP请求。 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments