ctf md5比较(一)

文章介绍了MD5作为一种哈希函数的特性,强调其不可逆性以及在密码学中的应用。同时,讨论了PHP中的弱类型比较,特别是`==`与`===`的区别,以及0e开头字符串在比较时会被当作科学计数法导致的特殊行为。文中还提到了利用MD5碰撞和PHP弱类型比较进行安全漏洞利用的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MD5由于0-9,a-f组成的最低16位,最高32位的哈希字符串。

md5本质也是哈希函数,是一种单向密码体制,在上面提到的MD5不可逆性,主要是体现在任意值可以转换成MD5,但是MD5却不能直接逆转成一个准确的字符串,就算是100位字符串转成md5,也是会得到一串32位的哈希字符串,在某乎看了一些大佬的解释,普通字符串在加密的md5过程中,只会挑取一些有用的信息进行计算,过程中丢弃了大部分的信息,这也是不可逆的原因,就好比一盆泼出去的水,怎么可能完整收的回来。一个字符串可能就只是对应一个md5值,但是算出来的md5值可能会对应多个值,虽然这看起来不可逆,但是通过MD5碰撞还是有可能逆向出来的。

现在最大的md5查询网站还是md5在线解密破解,md5解密加密 (cmd5.com),可以解出来比较多常见的md5编码。

== 是等于运算符,而===是全等运算符,两者之间最大的区别在于如何处理等号两边的字符串。首先==是一种常见于弱类型题目中,之所以常用于弱类型,是因为在进行比较时,不同类型的,会被转换成数字,如下所示:

var_dump('1' == 1); //true
var_dump('1a' == 1);  //true
var_dump('1a1' == 1);  //true
var_dump('a123' == 0);  //true
var_dump('1aa' == 0);  //false

同时还要特别提到一点,就是0exxxxxxxxxxxxxxxxxxxxxxxxxxxx,php在处理0e开头的字符串时,会当成科学计数法进行处理,0e123222222等于0,0e66666666666666666666等于0,0e后面跟任何数字都等于0,php手册的解释如下

翻译:这种比较是正确的,因为两个md5()散列都以“0e”开头,所以PHP类型杂耍将这些字符串理解为科学符号。根据定义,任何幂的零都是零。 

弱类型比较

show_source(__FILE__);
include('flag.php');
\$username = \$_GET['username'];
\$password = \$_GET['password'];
if(\$username != \$password){
if(md5(\$username) == md5(\$password)){
echo 'GET_FLAG:'.\$flag;
}else{
echo 'md5校验出错...';
}
}else{
echo '用户名密码不能相等!';
}

上面的例题中,要求两个字符串不能相等,但是又要求他们的MD5相等,看着无理取闹,实际上一切皆有可能。

上面我们补充了一个点,就是0e后面无论跟多大的数字都等于0,而且代码中的第四行md5($key_1) == md5($key_2)用的是==,也就是说,这里存在弱类型比较,由于md5几乎很难找得到相等的,除非被加密的两个值相等,还真的想不出不同值如何相等,但是如果让两个0e开头的字符串进行比较呢?这里任意挑了四个经过md5加密后是0e开头的字符串来进行对比,结果都等于true。

说明两个0e开头的值进行比较,会被当成科学计数法,0e永远等于零,所以就比较成功了。所以这一题的题解意见很明显了,就是找两个值加密后0e开头,且0e后面是纯数字的字符串即可,这里列出来一些常见的:

字符串所对应的MD5值
QNKCDZO0e830400451993494058024219903391
s878926199a0e545993274517709034328855841020
s155964671a0e342768416822451524974117254469
s1502113478a0e861580163291561247404381396064
s1885207154a0e509367213418206700842008763514
s214587387a0e848240448830537924465865611904

 还有很多的相近的值转换各位感兴趣的师傅可以在网上自己去找一下

另外:强比较不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行
但是我们可以用MD值完全相同的字符来进行绕过,也可用md5的空值来绕过,如使用加密数组进行绕过

例题

[SWPUCTF 2021 新生赛]easy_md5

 打开得到如上php代码,进行分析后发现是md5弱类型比较,只要满足:

 就可以得到flag,这里规范了传参方式,要求name使用GET传参password使用POST传参这里使用hackbar进行传参

 这里是由于两个md5值转换都为0e开头会转为0故会使其md5值相等,找到漏洞的得到flag

 [BJDCTF 2020]easy_md5

打开后得到一个空白只有输入框的界面:

 对其进行分析寻找在响应头中发现相应的线索:

 这里发现其实是一个md5结合sql的绕过题目:即先MD5绕过再sql注入进入数据库中

百度看一下md5($pass,true)的相关知识:

string 必需:   要计算的字符串。

raw 可选:  默认不写为FALSE。32位16进制的字符串 TRUE。16位原始二进制格式的字符串 进行post传参

这是一个典型md5ffifdyop绕过,这个点的原理是 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ‘ or ‘而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数

绕过过程解释:首先我们要找到一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。首先or这个字符串是必要的,同时为了配对原先sql语句里面有的单引号,在or的两边要有单引号,使它变成 password=‘xxx’or‘xxx’ 的形式,所以我们需要的字符串的原始二进制格式的字符串里要包含 'or' ,如果根据原始二进制来找到我们要的字符串可能会比较麻烦,那么可以根据32位16进制的字符串来查找,根据上面介绍的, 'or' 对应的16进制是 276f7227 ,所以我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,接着就是要看关键的数字部分了,在276f7227这个字段后面紧跟一个数字,除了0,1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是我们需要有276f7227+(31-39)这个字段,就可以满足要求。比如xxxxxxxxxxxxxxxx276f7227(31-39)xxxxxx

得到:

 查源码:

 进行正常的md5 get数组绕过

pyload:

得到代码:

 再次同上进行数组绕过:

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

得到flag 

自己在做CTF过程中做的总结下面中实验室指的是网络安全实验室 题目全部来自bugku,南邮和网络安全实验室,题较基础,实验吧要复杂些 文中所有知识点内容并不全,要学习原理及深入得自己去找资源学习 看这个的时候,以做题为主 所有工具的使用,就做题,遇到要用什么学什么 先去DVWA中学习文件上传,文件包含,代码执行,命令执行,尽量亲手操作遍,然后看前三个难度的源码,impossible难度的可以了解,网上有针对DVWA很详细的讲解 1.养成看源代码的习惯(简单) flag在源代码中(): 题目 firebug修改源码绕过本地验证(有视频) 题目 答案 CTF中源代码中般有提示或者有敏感信息,建议养成看源代码的习惯 ctrl加F通用的搜索快捷键。 这个题真是全程看源代码,快捷方式:F12 题目 答案 2. http头(不难): burpsuite,浏览器代理设置教程抓了包后右键放到repeater里,点go可以进行发包测试,用完Burpsuite过后,要正常上网的话,要把代理关了。 浏览器插件改包的话,(有视频) 找flag:在请求头,响应头尝试实验室:key究竟在哪里呢? 302跳转的中转网页,burp抓包在HTTP history中找本应该访问的网站链接(为了方便寻找可以先clear下历史),简单方法用firefox右键查看元素的查看网络中找到302跳转的网页,寻找flag(有视频) 南邮:单身百年也没用 如果题目中遇到只能某某ip才能访问(ip伪造),修改或添加http请求头的X-Forwarded-For为题目允许的Ip地址,实验室:本地的诱惑 题目中说为了外国人的话:确保Accept-Language中有en-US 没有就自己加,如果说了只为了的话,就删掉其它的语言类型。(有视频) 实验室:种族歧视 只能用某种浏览器访问,直接修改user-agent为对应浏览器名字 实验室:HAHA浏览器 Cookie的修改 实验室:冒充登陆用户 Referer来源伪造 题目这个题好像坏了,可以去看下wp。 答案 最后来个综合的题考察下你学的怎么样实验吧:头有点大 3. 文件包含(感觉必考) 利用: 读取敏感文件:如直接../../../../../etc/passwd来读取本地文件内容,其他敏感文件的读取是类似的 包含Apache日志文件(应该不会考) 远程包含shell 使用PHP封装协议读取文件和写入PHP文件 配合文件上传漏洞: 文件包含建议理解并操作dvwa的前三个难度的这个漏洞 例题:1.看到url里有?file=xxx.php(文件名) 考虑php伪协议读取源码, 然后利用这点,可以读取到你想获取的页面的源码例如: index.php,flag.php,login.php的源码,然后base64解密 url里?后面改成这个?file=php://filter/read=convert.base64-encode/resource=index.php 本句的意思是将Index.php的源码以base64加密后的形式读出来 南邮:文件包含 4.暴力破解:burpsuite暴力破解教程 bugku:输入密码查看flag 5. 文件上传(感觉必考) 例:只能传jpg等不能传php 查看网页源码,很清楚看到是前端JS控制的话,那么直接禁用 JavaScript就可以上传php文件了, 或者可以用burpsuite通过拦截数据包,修改filenmae后文件名后缀为php 1.jpg.php 1.php.jpg 1.php;.jpg 后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名) 抓包修改Content_Type里的multipart/form-data为Multipart/form-data(大小写绕过) bugku:求getshell 上传过后通过显示的路径进行访问,或者右键文件属性里查找。 bugku:文件包含2 答案该题因为结合了上传,所以可以上传句话木马,然后用菜刀连接 文件上传建议理解并操作dvwa的四个难度的这个漏洞
### CTF竞赛中的MD5 Web安全挑战 在CTF(夺旗赛)竞赛中,涉及MD5哈希函数的安全挑战通常围绕着碰撞攻击、彩虹表攻击以及暴力破解等方面展开。这些挑战旨在测试参赛者对于密码学原理的理解程度及其实际应用能力。 #### 碰撞攻击 种常见的基于MD5的Web安全问题是利用其弱抗碰撞性来伪造数据完整性验证机制。由于MD5算法存在已知漏洞,在特定条件下可以找到两个不同的输入产生相同的输出哈希值[^1]。这种特性可能被用于绕过文件上传过滤器或其他依赖于唯性的校验场景。 ```python import hashlib def find_collision(): hash_dict = {} while True: random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) md5_hash = hashlib.md5(random_string.encode()).hexdigest() if md5_hash[:6] in hash_dict: # 假设只比较前六位作为简化示例 print(f"Collision found between {random_string} and {hash_dict[md5_hash[:6]]}") break else: hash_dict[md5_hash[:6]] = random_string ``` #### 彩虹表攻击 另个重要方面是通过预先计算好的大型数据库——即所谓的“彩虹表”,来进行快速逆向查询给定散列对应的原始消息。尽管这种方法主要针对较短且简单的字符串,但在某些情况下仍然有效,尤其是在缺乏适当盐值处理的情况下。 #### 暴力破解 当面对受保护资源时,如果开发者错误地实现了会话管理逻辑,则可能会暴露出敏感信息。例如,使用不安全的方式存储用户凭证并仅依靠简单加密方式如MD5进行保护,这使得攻击者能够尝试所有可能性直到匹配成功为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值