[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
- 打开之后是这样一个页面
这样一个输入框后台就是上面的一个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了
有什么错误或者改进意见欢迎评论或发给我噢!大家一起共同学习!大佬多指教!!!!