当前位置: 代码迷 >> 综合 >> 第二十二题——[BJDCTF2020]Easy MD5
  详细解决方案

第二十二题——[BJDCTF2020]Easy MD5

热度:39   发布时间:2023-11-19 19:41:30.0

题目地址:https://buuoj.cn/challenges

解题思路

第一步:进入题目,就一个输入框

在这里插入图片描述

第二步:使用burpsuite抓包,查看提示

在这里插入图片描述

第三步:根据提示构建输入参数

  1. 分析漏洞:输入框输入的值交给pass,再进行一次md5加密后,将密文与sql查询语句进行查询

  2. 构建参数:要形成select * from admin where password = xxx or 1的永真语句,所以md5加密后的密文要包含' or 1',根据提示,输入ffifdyop,跳转到新页面。
    在这里插入图片描述

  3. 解释1:md5(string,raw),raw的值默认不写为FALSE,结果为32位16进制的字符串,raw设置了TRUE,其结果为16位原始二进制格式的字符串。答案也不唯一,可以尝试:129581926211651571912466741651878684928

content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c(false)
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c(true)
string: 'or'6]!r,b
content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
string: T0Do#'or'8
  1. 解释2:在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。所以这里是password=’‘or’6xxx’,构成永真式。

第四步:来到新页面,查看提示

在这里插入图片描述

第五步:构建参数,进行绕过

此页面让我们传递两个参数a与b,且a与b的值不同但md5值相同。可以通过数值绕过,原理:md5函数不能处理数组,导致函数返回Null。而Null是等于Null的。输入?a[]=1&b[]=2来到新页面。
在这里插入图片描述

第六步:绕过检测获取flag

新页面绕过方式同理,构建数组绕过,注意这里需要使用post进行提交,且要带上上一步的a,b参数
在这里插入图片描述