[BJDCTF 2020]easy_md5

发布时间 2023-07-29 23:10:27作者: y0Zero

[BJDCTF 2020]easy_md5

题目来源:nssctf

题目类型:web

涉及考点:弱比较、SQL注入

1. 题目给了一个传入口,先随便传点数据

  • 发现传入什么都没有回显,尝试抓包:
  • 在相应包中看到hint:
select * from 'admin' where password=md5($pass,true)

这里介绍下md5函数的知识点:

md5($a):返回a字符串的散列值

md5($a,TRUE):返回a字符串散列值的16进制转ascii码值(个人理解,若理解错了请评论区留言指出)

官方说法是:返回原始 16 字符二进制格式(实在理解不了)

看其他大佬的wp,拼接的语句应该是这样的:

select * from 'admin' where password=''or'6.......'

刚才在随便传数的时候,我们可以在url中注意到传入的是password,个人觉得应该是传到了$pass里面 。因此我们需要找一个字符串,这个字符串在进行md5后返回的散列值在ascii之后得到的字符串应该是:'or'6...,这样在拼接的语句中,相当于把外部单引号闭合掉,形成一个永真的语句(or)

则我们传入字符串ffifdyop(大佬的wp)

2. 传入后得到以下页面:

  • 查看网页源代码发现:
<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    header('Location: levell14.php');
-->

即我们需要GET传入字符串a和b,使得两者不等,但md5散列值相等,这里利用弱比较,只需md5散列值前几位相等即可

常用的几个见:[SWPUCTF 2021 新生赛]easy_md5

我们直接传入:

?a=QNKCDZO&b=240610708
  • 得到第三个页面:
<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

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

与第二个一样,只不过这次需要散列值完全相等,我们抓包进行POST传参:

传入后得到flag:

NSSCTF{e2748923-ff73-4822-81bf-7a5b5f73dfd0}

日期:2023.7.29

作者:y0Zero