MD5比较

在php中有两种比较的符号,“==”和“===”。

弱比较:使用“**==”进行比较,会先将两边转换成相同类型再比较,即仅比较值**。

强比较:使用“**===”进行比较,会先判断两边的数据类型是否相等,再进行比较,因此既比较值又比较类型**。

弱类型比较

原理

转换规则

1.同类型(数字型和数字型比较、字符型和字符型比较),比较其内容。比如’’aaa’’ == ‘’ab’’ -> false、123 == 223 -> false

2.字符型和数字型比较:若字符型值开头为数字,则转为数字;若开头不为数字,则为null弱比较和0相等。例如:“abc123” == 0 -> true

绕过

一、0e绕过

如果两个字符经MD5加密后的值以“0e”开头,则会被认作科学计数法,表示0*10**x,仍为0,则两者相等。

以下为一些可用字符串:

字符串 md5值
QNKCDZO 0e830400451993494058024219903391
240610708 0e462097431906509019562988736854
s1502113478a 0e861580163291561247404381396064
s1885207154a 0e509367213418206700842008763514
s1836677006a 0e481036490867661113260034900752
s155964671a 0e342768416822451524974117254469
…… ……
二、数组绕过

md5不能加密数组,传入数组会报错,但会继续执行并返回结果为null。

payload:?a[]=1&b[]=2

强类型绕过

一、数组绕过

见上。

二、使用md5加密后两个完全相等的字符串来绕过过滤
三、mysql里的ffifdyop绕过

万能通式:129581926211651571912466741651878684928和ffifdyop

实例:

select * from ‘admin’ where password=md5($pass,true)

输入md5(‘ffifdyop’,true)绕过

ffifdyop 这个字符串被 md5 哈希了后会变成 276f722736c95d99e921722cf9ed621c,Mysql会把hex转成ascii解释,而该字符串的md5转成字符串前几位刚好是’or’6,因此拼接之后的形式是 select * from ‘admin’ where password= ‘ or ‘6xxxxx ‘,等价于永远为真。