New BugKu web16

web16

题目描述

备份是个好东西

进入环境

只有一些哈希值

看看有没有主页的备份

下载到主页备份源码

查看源码

<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URL'], '?');
$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";
}
?>  

代码大致意思是

包含flag.php文件

预设报错为0

strstr 函数来检查接收参数的位置

substr返回$str的第第二个字符串

str_repleace替换$str中的key值

正则匹配$str

打印$key1的md5值

打印$key2的md5值

如果$key1的md5值不等于$key2的md5值和$key1 不等于$key2

就打印flag

emmmm

这个代码有点绕

重点就是要请求key1和key2

但是str_replace过滤了key这三个字母

这个str_replace只执行一次就是,可以使用重合的方式来进行请求

就是kekeyy1和kekeyy2

这样它把key给过滤掉了剩下的字符串就会组合成key了

然后要key1的md5值和key2的md5值相等但是又让key1和key2不相等

过关方法1:

php中有一个md5的对比漏洞

php是弱类型语言

==进行对比的时候只判断两个参数的值,而不判断参数的类型

<?php
$str = md5('QNKCDZO');
var_dump($str == '0');

这个段代码打印出来的是bool(true)

只要是0e开头的md5值互相对比都会出现这种情况

过关方法2:

在php中利用md5值无法加密数组的特性

进行绕过

注:

** **在php中md5函数加密数组会返回一个NULL的值