Web 10 [SWPUCTF 2021 新生赛]easy_md5

piter 发布于 2024-12-09 90 次阅读 373 字


AI 摘要

在SWPUCTF 2021 新生赛中,挑战者们面临一个有趣的难题:如何让两个不同的字符串在MD5哈希下却相同?通过深入解析PHP的弱类型比较特性,参与者们发现了意想不到的解决方法,包括利用数字注入和数组处理等技巧。文章将带您探索这一黑客思维的背后,揭示如何通过巧妙的参数设置绕过安全限制,获取隐藏的flag,令人惊叹的编程技巧即将展开!

SWPUCTF 2021 新生赛]easy_md5 | NSSCTF

题目说了是MD5,打开网页

题目意思:

  1. namepassword是通过GET和POST请求分别传递的参数。
  2. namepassword必须是不同的字符串($name != $password)。
  3. 但它们的MD5哈希值必须相同(md5($name) == md5($password))。

既要两变量个值不相同,又要两个变量md5值一样

可以发现此时判断md5值是否一样用的是==,这是php的弱类型比较

方法一:

可以使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等,而两个变量值不相等

使用hackbar来操作

  • load URL
  • 在网址后输入/?name=240610708
  • password=QLTHNDT

拿到flag

name和password 的等号后面只需要输入会被MD5加密为0e开头的数字就行,但是内容不能一模一样。

NSSCTF{599b6374-4984-467d-aa61-3181aa93ff43}

方法二:

看了其他师傅的wp,

可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null

若遇到===这样的强类型比较,方法一就失效了,方法二仍然有效,或者还可以使用软件fastcoll进行md5碰撞,生成两个字符串使得他们的md5值相同

故传递数组作为$name$password的值

$name = array('123');
$password = array('456');

或者在URL中传递

?name[]=123&password[]=456

总结

  • MD5相关知识
  • php的弱类型比较

  • wechat_img
永远不要因为需要大量时间才能完成,就放弃梦想,时间怎么样都会过去的
最后更新于 2024-12-09