[BJDCTF2020] EasyMD5

Easy MD5

在相应头中给出了查询语句

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

md5($pass,true)绕过

从php手册中我们可以看出md5()的用法

但这个”返回原始16字符二进制格式”是什么意思呢?

这里的原始二进制数据不是指100111这些二进制数据,而是原始字符串转换成ascii码后组成的字符串。

比如就拿许多个wp里写的万能密码”ffifdyop”来说:

  • 先使用md5(“ffifdyop”)进行加密

得到32位的16进制字符串:276f722736c95d99e921722cf9ed621c

  • 然后将这些字符串按照2个为一组切割成16组hex字符串

27,6f,72,27,36,c9,5d,99,e9,21,72,2c,f9,ed,62,1c

  • 再将每组转换为十进制数值

39,111,114,39,54,201,93,153,233,33,114,44,249,237,98,28

  • 再对照ascii表就可以翻译出原始二进制字符串

例如:39,111,114,39就对应'or'

查找适合的值:

<?php
for ($i = 0;;) {
for ($c = 0; $c < 1000000; $c++, $i++)
if (stripos(md5($i, true), "'or'") !== false)
echo "\nmd5($i) = " . md5($i,true) . "\n";
echo ".";
}
?>

有次可见算出来的几个值都有对应'or'

一般推荐得比较多的就是ffifdyop这串字符。

因此有了这个知识,就可以利用这点构造万能密码进行sql注入了。

sql注入

这一步就不说了8

如果用ffifdyopsql语句就成了

select * from `admin` where password=''or'6<trash>'

<trash>代表的是不可见字符,在mysql转换成整型时丢掉。

emm这道题有点迷惑,按道理说用算出来的都可以,但是我试了下只有ffifdyop才成功了。

然后我看了下源码

直接比较还行

md5绕过

然后新页面有这样一段代码

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

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

?a=QNKCDZO&b=s214587387a就可以了

然后进入levell14.php

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

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

数组绕过就可以了

param1[]=1&param2[]=2
Author: Neorah
Link: https://neorah.me/ctf/BJDCTF2020/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.