打开题目网址,入眼一串md5值,解密为空值:
抠题目字眼,备份两个字,联想到 .bak 或者 .swp 文件,利用御剑扫描网址,发现一个 .bak 文件:
访问下载得到 index.php 的源码,
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
源码的大致解释是:
include_once() 文件包含一次;
ini_set() 类似于报错不显示,strstr() ,将url 中? 以及后面的字符串赋值给 $str ;
substr() 从字符串第二位开始读取赋值给 $str ;
str_replace() 将 $str 中出现的 key 字符串替换成空,此函数区分大小写;
parse_str() 将字符串解析成变量和值;
md5() 对字符串进行 md5加密;
(md5(
k
e
y
1
)
=
=
m
d
5
(
key1) == md5(
key1)==md5(key2) && $key1 !== $key2) 只要使得 $key1 和 $key2 经过MD5 加密后值相等,但是值和类型的比较不相等,就输出 flag;
1,首先使用双写绕过,因为str_replace() 这个函数只会进行一次过滤,因此传入 kekeyy1 后经过过滤变成 key1 成功传入,关于双写绕过具体介绍请看转载博客:双写绕过
2,md5绕过,因为md5() 函数无法处理数组,因此传入数组使得 md5() 处理出来的 key1 和 key2 都是 NULL ,而二者的数组元素不同,达到输出flag的目的;
3,解题具体思路请前往:对md5加密的绕过