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

在输入框查询任何内容都返回为空,尝试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加密276F722736C95D99E921722CF9ED621C
16位原始二进制格式'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string'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

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

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){	//a不等于b的同时,MD5后的a要等于MD5后的b
-->

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

构造payload

?a=QNKCDZO&b=s878926199a

跳转至下一个页面

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

payload:param1[]=1&param2[]=2

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值