password=md5($pass,true)绕过、弱类型、MD5强碰撞

您所在的位置:网站首页 md5类型 password=md5($pass,true)绕过、弱类型、MD5强碰撞

password=md5($pass,true)绕过、弱类型、MD5强碰撞

2024-03-31 03:30| 来源: 网络整理| 查看: 265

在输入框查询任何内容都返回为空,尝试sql注入无果,用bp抓包

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

确实执行了我们的查询,但是在通过where时,条件不匹配,导致报错

需要password=md5($pass,true)条件为真时,才会执行select * form admin

md5()函数会将我们输入的值,加密,然后转换成16字符的二进制格式,由于ffifdyop被md5加密后的276f722736c95d99e921722cf9ed621c转换成16位原始二进制格式为'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c,这个字符串前几位刚好是' or '6

MD5加密276F722736C95D99E921722CF9ED621C16位原始二进制格式'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1cstring'or’6]!r,b

我们将ffifdyop带入测试环境,查看执行结果

所以输入ffifdyop后,内部执行语句就会变为

select * from 'admin' where password='or'6�]��!r,��b'

但是为什么偏偏当password='or'6�]��!r,��b'时,会判断为真呢?在mysql内,用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=' or '1xxxx',那么就相当于password=' or 1,所以返回值就是true

所以这里使用的sql语句可以化简为

select * from 'admin' where password='or 6

跳转至下一个页面,右击查看源码

考的是md5弱类型,为0e开头的会被识别为科学记数法,结果均为0

构造payload

?a=QNKCDZO&b=s878926199a

跳转至下一个页面

考的是MD5强碰撞,如果传参不是字符串,而是数组,md5()函数无法解出数值,就会得到===强比较的值相等

payload:param1[]=1¶m2[]=2



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3