http://123.206.87.240:8002/web16/
打开页面之后发现是这个样子,查看源码也没啥好东西。
题目叫做“备份是个好习惯”,试着扫一下目录。
.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";
}
?>
这段代码大概意思是:首先获取当前的uri,接着把uri中“?”以及“?”之后的字符串赋值给变量,然后再删掉“?”再赋值给变量,如果字符串中含有“key”,将key替换为空.再将字符串解析到变量中,再比较key1.key2的md5值。
解析流程:
url:http://123.206.87.240:8002/web16/?key1=xxx&key2=xxx
获取uri,也就是获取域名后面的东西/web16/?key1=xxx&key2=xxx
获取?key1=xxx&key2=xxx
获取key1=xxx&key2=xxx
再通过parse_str函数,url参数key1,key2变为变量$ key1,$key2
$str = str_replace(‘key’,’’, $str) 【正常传参的话,key会被置换为空,通过构造kkeyey来绕过】
想要获得flag,需同时满足key1.key2的md5值相等且key1的值等于key2的值。
绕过方式:
1.md5无法对数组进行构造,传参为数组返回null,满足条件。
http://123.206.87.240:8002/web16/?kkeyey1[]=xxx&kkeyey2[]=ccc
2.利用php弱类型GETFLAG
http://123.206.87.240:8002/web16/?kkeyey1=240610708&kkeyey2=QNKCDZO
240610708 md5加密:0e462097431906509019562988736854
QNKCDZO md5加密:0e830400451993494058024219903391
0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0
php弱类型详解参考博客:https://www.cnblogs.com/Mrsm1th/p/6745532.html