[BJDCTF2020]Easy MD5

[BJDCTF2020]Easy MD5

知识点:

password='".md5($pass,true)."'

$pass:是我们输入的字符串
true:这个变量默认不写为false,32位16进制的字符串,但是我们这里定义为ture,那就是16位原始二进制字符串

知识点参考链接:

https://blog.csdn.net/March97/article/details/81222922

就是输入ffifdyop可以绕过md5函数,原理我简单说明以下,以上链接有详细说明:因为ffifdyop的md5的原始二进制字符串前面刚好是‘or’6这一部分的字符,这样的话原式就变成password=‘xxx’ or ‘6xxxxxxxxx’,然后后面6xxxxxxxxx就相当于6,所以就变成password=‘xxx’ or ‘6’,因为后面位true,所有数字都为true,除了0,这样就变成了一个永真式,相当于万能密码,可以绕过md5函数。

下面来一个例题吧:

例题地址:

https://buuoj.cn/challenges#[BJDCTF2020]Easy MD5

  1. 打开之后是这样一个页面

这样一个输入框后台就是上面的一个password='".md5($pass,true)."'判断语句,$pass就是我们要输入的内容。我们输入ffifdyop。

查看这个页面源代码会发现这样一段注释:

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

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

大概意思:
通过GET方式传入一个$a,$b,这两个不能相等,这两个经过md5加密结果得相等
绕过md5方法:
md5()或者sha1()之类的函数计算的是一个字符串的哈希值,对于数组则返回false,如果$a和$b都是数组则双双返回FALSE, 两个FALSE相等得以绕过

我们构造payload?a[]=1&b[]=2

然后就会出现一个这样的页面

代码意思就是:

用POST方式传入两个变量,判断条件跟前面一样,下面我们传入变量

提醒:我们传入POST变量的时候,页面得在levell14.php这个页面

然后就得到flag了


posted @ 2021-07-07 10:50  胖三斤1  阅读(134)  评论(0编辑  收藏  举报
Live2D