Z1d10tのBlog

A note for myself,have fun!

buuctf [BJDCTF2020]Easy MD5

img

思路:看到url上又password字样,又有输入栏,随便传入admin然后抓包试试,发现提示。

img

显示select * from 'admin' where password=md5($pass,true)

分析:通过sql语句,从admin表里查数据,当password=md()函数加密后的pass时就可查询。

考点:

  1. sql语句注入
  2. md5()函数:本来应该返回32 位的十六进制数形式散列值,但是此题可选的 binary 被设置为 true,那么 md5 摘要将以 16 位的原始二进制格式返回。

看到作业提示md5在sql注入中常见的搭档是字符串ffifdyop,然后去谷歌,csdn看看这是什么东西。

ffifdyop

经过md5加密后:276f722736c95d99e921722cf9ed621c

再转换为字符串:’or’6<乱码> 即 ‘or’66�]��!r,��b

原理:md5()函数先把 **ffifdyop**加密为**276f722736c95d99e921722cf9ed621c**Mysql 又会把 hex (十六进制)转成 ascii 解释

在or的两边要有单引号,使它变成 password=‘xxx’or‘xxx’ 的形式

因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’ 为一个永真式

img

输入得到代码:

1
2
3
4
5
6
$a = $GET['a'];
$b = $_GET['b'];


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

分析:通过get传参a,b,使得题目md5值弱相等 。

方法:

  1. 数组绕过
  2. md5()值碰撞,有一些特殊的数值在md5()加密后会形成0e开头的字符串,从而达到弱相等

md5()碰撞原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$a=md5('QNKCDZO');
$b=md5('s878926199a');
echo $a;
echo "\n";
echo $b;
echo "\n";
if($a==$b)
{
echo "他们弱相等";
}
?>
输出:
0e830400451993494058024219903391
0e545993274517709034328855841020
他们弱相等

选择任何方法都行,之后得到:

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
include "flag.php";


highlight_file(__FILE__);


if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}

同理,不过之后是强类型相等,估计这一关是考察数组绕过吧,之后得到flag

img

本文最后更新于 天前,文中所描述的信息可能已发生改变