备份是个好习惯

开卷看题

题干提示我们可能存在备份文件

开始探索

主页面有一串天文数字,仔细一看是两个相同数据重叠了,提取出来扔到cmd5上跑一下看看

貌似没什么用,还是扫描一下备份文件吧

NICE,成功扫描到了index.php.bak,访问一下

分析源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);

// 提取GET参数
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);

// 删除GET参数中的key字符串,使用双写key绕过
$str = str_replace('key','',$str);

// 把字符串解析到变量中
parse_str($str);

// 打印参数值
echo md5($key1);
echo md5($key2);

// 重头戏:还记得矛盾那道题吗?这个是新的"矛盾",如果两个数不一样但MD5一样即可输出flag
if(md5($key1) == md5($key2) && $key1 !== $key2) {
echo $flag."取得flag";
}
?>

总结就是找到两个数值不同但MD5相同的数,根据MD5的文档可知,两个不同字符串MD5相同的概率低到直接忽略不计( 1/(10E28) ),这条路堵死了。

柳暗花明

就在此时突然发现了一个细节

MD5值比较用的弱等于,而两个key值之间的比较用的强等于,也就是说比较MD5这里大有文章可做

果不其然,经过了谷歌探索之后,发现可以使用科学计数法进行绕过

原理:0的任何次幂都是0,用科学计数法表示就是0e后面接任何数字

列举出几个MD5值前两位是0e的:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a
  • s214587387a

  同时在查询资料时还发现MD5无法计算数组,对于数组的计算结果总是为NULL,使用此特性也可以达到不同数值但MD5值相同的效果

迈向未来

经过上述知识铺垫,最终的payload方案如下:

  1. kkeyey1=QNKCDZO&kkeyey2=240610708 使用科学计数法
  2. kkeyey1[]=somthing&kkeyey2[]=anything 使用数组

本次演示采用第二种方案(因为数组计算的MD5为NULL不会显示在页面上造成干扰)

得到了想要的答案,NICE

后记

谷歌大法好