[BJDCTF2020]Easy MD5 1

考点:
1、sql注入中的md5($string,raw)
2、php类型
3、md5中数组绕过

目录

解题步骤

一、

进去先输入字符串,看变化
[BJDCTF2020]Easy MD5 1
在响应头中我们可以看到password=md5($pass,true),其中(具体看这里

true是一个可选项:
默认不写为FALSE。32位16进制的字符串
TRUE。16位原始二进制格式的字符串

md5函数在指定了true的时候,是返回的原始 16 字符二进制格式。返回的这个原始二进制不是普通的二进制(0,1),而是 'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c 这种,并且与’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c对应的字符串"ffifdyop",经md5加密后的字符串:'or’6]!r,b

为什么要用ffifdyop这个字符串,是因为他的原始二进制中‘or’6,反过来说如果一个字符串的原始二进制中有‘or’6(当然6也可以是其他数字)也可以。
这样的话就可以让sql语句永远有返回值。

二、

输入ffifdyop,可以看到这样一个页面
[BJDCTF2020]Easy MD5 1
看一下源码

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

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

它意思是a要不等于b,且加密后的a要等于b(弱等于)
两种绕过方法:

1、构造两个经过md5后都是以0e开头的字符串
//a=QNKCDZO&b=aabg7XSs
//php里面在做 == 的时候会先把两边的类型转成一样的,
//并且是0e开头,PHP会认为这是科学计数法,
//不管0有多少次方都为0

2、构造两个数组
//因为md5处理不了数组,只能是字符串,两边都处理数组返回false,也就相等了

三、

进入后
[BJDCTF2020]Easy MD5 1
它提示我们param1要不完全等于param2,且他们两md5后要恒等于。

!==和!=是不一样的
//前者要不完全等于,也就是可以类型不一样,或者值不一样
//后者要类型转换后不等于 。

这边绕过就不能用上边的第一种绕过,要用第二种。

param1[]=1&param2[]='1'
//post传参

然后就可以看到flag了。
[BJDCTF2020]Easy MD5 1

参考

sql注入:md5($password,true)
bfengj

上一篇:前端面试题 4


下一篇:SpringCloud中使用OpenFeign调用出现的问题