MD5绕过与SHA-1绕过
0e绕过
SHA-1 也适用。
当字符串为 ^[0-9]+e[0-9]+
模式时,PHP 将试图把字符串转换为用科学计数法表示的数。如果不是真正的科学计数法表示的数,即 e 后面不全是数字,转换将出错,此时 PHP 将把它视为一个字符串。
所以,如果两字符串的 MD5 值都是 ^0e[0-9]+
模式,即 e 后全部是数字,则可绕过 MD5 弱相等。
以下字符串的 MD5 值均为 ^0e[0-9]+
的模式,即可转为数字 0 :
- QNKCDZO
- QLTHNDT
- PJNPDWY
- NWWKITQ
- NOOPCJF
- MMHUWUV
- MAUXXQC
- 240610708
- s878926199a
- s155964671a
- s214587387a
以下字符串的 SHA-1 值均为 ^0e[0-9]+
的模式,即可转为数字 0 :
- 10932435112
- aaroZmOk
- aaK1STfY
- aaO8zKZF
- aa3OFF9m
- 0e1290633704
对于双重 md5() ,以下字符串进行两次 md5() 后以 0e 开头:
- 7r4lGXCH2Ksu2JNT3BYM
- CbDLytmyGm2xQyaLNhWn
- 770hQgrBOjrcqftrlaZk
对于 $a==md5($a)
:
- 0e215962017
绕过 SQL 中的 md5() ,参考[BJDCTF 2020]easy_md5 :
ffifdyop
,经过 md5() 函数后结果为'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
129581926211651571912466741651878684928
,经过 md5() 函数后结果为\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
数组绕过
PHP md5() 函数不能处理数组类型的量,将返回 NULL 。使用数组可以绕过 MD5 弱相等和强相等。
sha1() 也不能处理数组类型的量,所以使用数组也可以绕过 SHA-1 弱相等和强相等。
1 | $a[]=1; |
NaN和INF绕过
NAN 和 INF ,分别为非数字和无穷大,但 var_dump() 显示的数据类型都是 double 。
NAN 和 INF 拥有特殊的性质,它们与任何数据类型(除了true)做强类型或弱类型比较均为 false ,甚至 NAN===NAN
也是false 。但 md5() 函数处理它们的时候,是将其直接转换为字符串 NAN
和 INF
使用的,故 md5('NaN')===md5('NaN')
为 true 。
MD5碰撞
几组 payload:
1 | #1 |
Windows 下可用 fastcoll.exe 生成。
SHA-1碰撞
payload:
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 |