295 字
1 分钟
Web 10 [SWPUCTF 2021 新生赛]easy_md5

题目说了是 MD5,打开网页:

题目条件:
name通过 GET 传递,password通过 POST 传递name和password必须是不同的字符串($name != $password)- 但它们的 MD5 哈希值必须相同(
md5($name) == md5($password))
既要两个值不相同,又要 MD5 值一样。
注意这里用的是 ==,是 PHP 的弱类型比较。

方法一:0e 开头的魔法哈希
PHP 会将 0e 开头的字符串作为科学计数法处理,视为 0。利用两个 MD5 值都是 0e... 开头的字符串:
name=240610708(MD5 为0e462097431906509019562988736854)password=QLTHNDT(MD5 为0e99181294634472991s)
两者 MD5 在弱类型比较下都等于 0,满足 md5($name) == md5($password),而 $name != $password 也成立。
用 HackBar 操作:
- Load URL
- 网址后加
?name=240610708 - POST body 填
password=QLTHNDT


NSSCTF{599b6374-4984-467d-aa61-3181aa93ff43}
方法二:传递数组
传递数组让 MD5 无法加密(返回 null):
?name[]=123&password[]=456PHP 中 md5(array) 返回 null,两者相等,同时 name[] != password[] 也成立。
若遇到
===强类型比较,方法一失效,方法二仍有效。或者用工具fastcoll进行 MD5 碰撞,生成两个 MD5 值完全相同的字符串。
总结
- PHP 弱类型比较(
==vs===) - MD5 魔法哈希(0e 绕过)
- 数组绕过 MD5 函数
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Web 10 [SWPUCTF 2021 新生赛]easy_md5
https://npiter.de/posts/web-10-swpuctf-2021-新生赛easy_md5/ 部分信息可能已经过时
相关文章 智能推荐









