[BJDCTF2020]Easy MD5

相关知识点

  • md5(string, raw)

    phpmd5()用于计算字符串的 MD5 散列。

    参数string为需要计算的字符串,为必填选项;

    参数raw为规定十六进制或者二进制的输出格式。当raw为TRUE:输出格式为16字符二进制,当raw为FALSE:输出格式为32字符十六进制,5.0版本以后为raw为选填选项,默认为FALSE,因为为TRUE时浏览器解析会出现乱码。

  • 在SQL中的绕过

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

      在该语句中,前端页面要求我们将传入的pass转化为以16字符二进制为格式的md5值,如果没有md5加密的话,我们很容易想到使用' or 'xxxx来让绕过该SQL语句,由于该地方有加密操作,所以直接使用or是不行的,我们要用到字符串ffifdyop,其加密后的二进制格式为'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c 这是为数不多的转换为16字符二进制后带or的,这样就实现了该SQL语句的绕过。详细可以参考:https://blog.youkuaiyun.com/March97/article/details/81222922

    2. $a != $b && md5($a)==md5($b)
      

      我们分析一下该句话的意思,它要我们传入两个值a,b,且a和b明文不相同但是md5加密后就相同,这里可以使用科学计数法和数组来绕过。

      科学计数法。在经过MD5加密后是0exxxxxx形式的字符就被认定为科学计数法,即表示0×10^xxxxxx,当然结果还是0,可以被加密为科学计数法的字符串有以下几个:QNKCDZO240610708s155964671as214587387as214587387a s878926199a

      数组。在php中,md5无法数组加密,当遇到数组时会返回NULL,所以我们对两个不同的数组进行md5后的值都为NULL,即相等

靶场实操

随便提交数据并且抓包得:

在这里插入图片描述

在数据包中发现了该语句:

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

使用ffifdyop绕过该语句,得到回显代码:

在这里插入图片描述

根据回显代码中的提示,发现了页面levels91.php,我们进行访问得:

在这里插入图片描述

且在该页面中的原始代码中发现如下提示:
在这里插入图片描述

改代码提示我们需要以GET形式提交两个参数 a 和 b ,且 a 的值不等于 b 的值,但是 a 的值与 b 的值经过 MD5 加密后一样,在比较的时候用到了==弱比较方式,则我们可以使用科学技术法或者数组的方式绕过

对于科学技术法,我们常见的 MD5 加密后以 0e 开头的字符串有

QNKCDZO
s878926199a
s155964671a
s1885207154a
s1836677006a
s1184209335a

故我们可以构造Payload:?a=s878926199a&b=QNKCDZO ;对于数组方式,我们可以构造Payload:?a[]=1&b[]=2

得到如下页面:

在这里插入图片描述

在改页面中出现了提示页面levell14.php,访问得:

在这里插入图片描述

该代码提示我们以POST方式提交两个参数param1param2,并且该两个参数值不同,但是加密后的值需要一样,与上一个页面不同的是,该页面在比较的时候使用的是强比较符号,此时我们科学技术法已经不再适用,但是数组的方式仍可以使用,因为不管是 MD5 还是 SHA 加密方式都无法解析数组,返回的都为 NULL,故我们构造Payloadparam1[]=1&param2[]=2且以POST方式提交,得到 flag:

在这里插入图片描述

### 关于BUUCTF中Easy MD5挑战的信息 在处理BUUCTF中的Easy MD5挑战时,主要目标是理解MD5哈希函数的工作原理以及如何逆向分析特定场景下的输入输出关系。然而,在提供的参考资料中并未直接提及有关BUUCTF的具体内容。 对于BUUCTF的Easy MD5挑战,通常涉及的是给定一个MD5散列值,参赛者需要找出能够生成该散列值的原始字符串。由于MD5是一种单向加密算法,理论上无法通过计算反推出原串,但在某些特殊情况下可以通过字典攻击或者暴力破解来尝试匹配已知的常见短语或简单模式[^1]。 为了应对这类CTF竞赛题目: - **构建常用词库**:创建一个包含大量可能出现单词、短句或其他潜在候选者的列表。 - **优化查找过程**:利用多线程技术加速遍历整个数据库的速度;也可以考虑采用GPU并行运算进一步提升效率。 - **注意边界条件**:有时命题人会在提示里暗示一些额外约束(比如长度范围),这有助于缩小搜索空间。 ```python import hashlib from concurrent.futures import ThreadPoolExecutor def md5_hash(text): return hashlib.md5(text.encode()).hexdigest() target_md5 = "d41d8cd98f00b204e9800998ecf8427e" wordlist = ["hello", "world"] # 这只是一个简单的例子,请替换为实际使用的更大规模字典文件路径 with ThreadPoolExecutor(max_workers=10) as executor: futures = {executor.submit(md5_hash, word): word for word in wordlist} for future in futures: hashed_word = future.result() if hashed_word == target_md5: print(f"Found match! Original string was: {futures[future]}") break else: print("No matches found.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丙戌年1101

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

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

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

打赏作者

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

抵扣说明:

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

余额充值