备份是个好习惯
- 常用备份文件后缀:.swp,.bak
- strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
- str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。
例:把字符串 “Hello world!” 中的字符 “world” 替换为 “Shanghai” - 在PHP中,== 在进行比较的时候,会先将字符串类型转化成相同,再比较。注意,如果比较一个数字和字符串 或者 比较涉及到数字内容的字符串时,则字符串会被转换成数值并按照数值来进行比较。
举个小例子:
var_dump('asdas',0); 和 var_dump('0asdas',0);
的结果都是true。
解题:
1.备份是关键字,我们可以用御剑扫扫
得到http://114.67.246.17617674/index.php 打开之后由于题设备份文件,故加上.bak(swp错误),之后得到一个文件,打开之后发现代码
<?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";
}
?>
2.3.法一:php弱类型比较绕过
科学计数法是 e**** ,要使两个数的值相等,以0e开头的md5值可以绕过限制。
构造payload:?kkeyey1=QNKCDZO&kkeyey2=240610708
法二:漏洞
MD5 加密是对字符串进行加密,那么如果我们传入的不是字符串,而是一个数组,它没法进行加密,返回空,结果就相等了。
构造payload:?kkeyey1[]=1&kkeyey2[]=2
用kkeyey而不用key的原因:
$str = str_replace('key','',$str);
即gat到的变量中所有key替换为空格,所以这里要用kkeyey来绕过,使echo md5($key1);
echo md5($key2);能够取值key1与key2。