[BJDCTF2020]Easy MD5

[BJDCTF2020]Easy MD5

Step 1

看源代码没线索,用burp抓包看一下:

image-20240723193558838

发现提示,发现输入的是password

image-20240723193650559

要构造使password=’or‘1的形式使之形成永真的语句

md5($pass,true)应该就是将pass的值md5加密后成十六进制转换成字符

这时候276f7227就是十六进制的'or',只要MD5加密成276f7227+(非30)+随意填充到16个的字符,由于MD5加密不可逆,这比较难构造。

就上网看了一下wp,发现ffifdyop返回的散列值的ascii字符串就是'or'6É]™é!r,ùíb,前面是'or'6可以构成永真式

Step 2

来到下一步,查看源代码,顶部发现

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

是md5弱比较==

法一,0e绕过,百度的智能回答

  • 0e绕过:‌当两个字符串的MD5哈希值以"0E"开头时,‌它们在弱比较中会被视为相等,‌即使原始字符串不相等。‌例如,‌字符串"QNKCDZO"和"s878926199a"的MD5哈希值都以"0E"开头,‌因此在弱比较的情况下,‌它们会被认为是相等的,‌从而绕过安全检查。‌
  • Payload示例:‌为了利用这种弱比较的漏洞,‌攻击者可以构造特定的输入,‌如"?a=QNKCDZO&b=s878926199a",‌这样即使"a"和"b"的值在原始形式下不相等,‌但由于它们的MD5哈希值以"0E"开头且在弱比较中被视为相等,‌因此可以绕过某些安全检查。‌

但是比较难记,还有方法

法二,数组绕过

md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null

比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等

payload=?a[]=1&b[]=2

Step 3

得到

<?php
error_reporting(0);
include "flag.php";

highlight_file(FILE);

if(\(_POST['param1']!==\)_POST['param2']&&md5(\(_POST['param1'])===md5(\)_POST['param2'])){
echo $flag;
}

三个===,MD5强比较,post传入

hackbar一下,用数字绕过

image-20240723203457953

最后成功获得flag

总结

MD5口诀

数组绕过,0e绕过

QNKCDZO 240610708 常用

md5(\(a)==md5(md5(\)a))

0e215962017

MD5加密登录万能通用

ffifdyop

参考

md5强比较&弱比较_md5弱比较-CSDN博客

posted @ 2024-07-23 20:38  8o1er9t  阅读(13)  评论(0编辑  收藏  举报