[BJDCTF2020]Easy MD5

1、四处找提示

2、分析代码

md5(string,raw)

参数 描述

string 必需。要计算的字符串。

raw 可选。默认不写为FALSE。32位16进制的字符串
TRUE。16位原始二进制格式的字符串
进行post传参

所以首先我们要找到一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。

我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,接着就是要看关键的数字部分了,在276f7227这个字段后面紧跟一个数字,除了0,1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是我们需要有276f7227+(31-39)这个字段,就可以满足要求。比如xxxxxxxxxxxxxxxx276f7227(31-39)xxxxxx

ffifdyop,这个点的原理是 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ‘ or ‘6,
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’

等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数
我们找到了:

1 ffifdyop

经过md5()后为

1 276f722736c95d99e921722cf9ed621c

3、输入后在网页源代码里找到提示

数组绕过
md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null

比如将两个数组的md5值进行比较

md5(a[]=1) === md5(b[]=1)
由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样

null === null
结果返回true,也就是说数组的md5值进行比较时,结果相等

数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(===)

进行get传参 绕过

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

进行跳转

利用post发送

1 param1[]=1&param2[]=2

 

eg:

双等号(==):两个等号我们称为等值符,当等号两边的值为相同数据类型时,直接比较值是否相同,当类型不同时会发生数据类型的转换,转换为相同的类型后再进行比较。(通常在if判断语句中使用) 

 (1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。

( 2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等

 

 三等号(===):三个等号我们称为绝对等同符,既要判断数值也要判断数据类型是否相等,当等号两边的值为相同数据类型时,直接比较等号两边的值,值相同则返回true;若等号两边的值类型不同时直接返回false。

 

posted @ 2022-07-24 21:04  heartBroken  阅读(486)  评论(0编辑  收藏  举报