备份是个好习惯
http://123.206.87.240:8002/web16/
通过提示 关键词 ’备份‘ 可以联想到 → 备份文件
备份文件一般都是.bak结尾的
用工具扫一下
这里推荐大佬的工具 yihangwang/SourceLeakHacker
可以看到index.php.bak
访问一下试试
有一个bak备份文件 ,不多解释了,下载后打开
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Norse 5 * Date: 2017/8/6 6 * Time: 20:22 7 */ 8 9 include_once "flag.php"; 10 ini_set("display_errors", 0); //in_set 设置指定配置选项的值 11 $str = strstr($_SERVER['REQUEST_URI'], '?'); //strstr 截取字符串 12 $str = substr($str,1); // 返回字符串的一部分 1为字符串总数的返回开始位 13 $str = str_replace('key','',$str); //在$str 中替换 key 为 '' 14 parse_str($str); //把字符串解析到变量里 这里可以这么理解字符串为key1=1,key2=2 → $key=1;$key2=2 15 echo md5($key1); 16 17 echo md5($key2); 18 if(md5($key1) == md5($key2) && $key1 !== $key2){ 19 echo $flag."取得flag"; 20 } 21 ?>
11行 strstr 获得URI从'?'往后(包括'?')的字符串 stristr 同strstr用法一样,不区分大小写
12行 substr 去掉'?'
13行 str_replace 把字符串中的'key'替换为空可以使用类似这样的语句:kkeyey 处理
14行 parse_str 把字符串解析到变量中
end 最后需要得到key1,key2不相等而二者md5相等,可以利用php弱类型比较绕过
php弱类
这里稍微提一下php弱类
首先,我们一般说php变量类型8种
标量类型:布尔boolean,整形integer,浮点float,字符string
复杂类型:数组array,对象object
特殊类型:资源resource,空null
与别的语言不同,php是一个弱类型的语言
==表示的是等于 ,只要数值等于就可以了,类型无所谓的
就是说上面列举的那些类型 之间相互比较 只看值就行了 不用看类型
php弱类型语言总的类型判断
php一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较。
PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。
那么回过头来看题目(-_-)
这一题需要构造的是 $key1 == $key2
构造的要求是md5值相同,但未计算md5的值不同的绕过。
那我们就来构造 O(∩_∩)O
介绍一批md5开头是0e的字符串,
0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,
0的多少次方还是0。md5('240610708') == md5('QNKCDZO')成功绕过!
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514
构造payload:?kkeyey1=QNKCDZO&kkeyey2=240610708
参考 :