打开页面是一串字符,看起来是md5
不抱希望去解码一下居然解开了:
没有什么信息,既然题目说了“备份是个好习惯”,就扫一下后台吧
访问这个index.php.bak下载
去掉bak后缀后打开,是一段php代码,一句话一句话看一下(写在注释里面了):
(每一句学习时的调试都是在http://www.dooccn.com/php/中进行的)
1 <?php 2 3 /** 4 * Created by PhpStorm. 5 * User: Norse 6 * Date: 2017/8/6 7 * Time: 20:22 8 */ 9 10 include_once "flag.php";//包含一次flag.php 11 ini_set("display_errors", 0);//修改php.ini中的配置,display_errors=0 12 $str = strstr($_SERVER[‘REQUEST_URI‘], ‘?‘);//搜索?在url中的第一次出现并将str赋值为包括?在内的剩余的部分 13 $str = substr($str,1);//去掉str的第一位(也就是?) 14 $str = str_replace(‘key‘,‘‘,$str);//将str中的key用空替代 15 parse_str($str);//把查询字符串解析到变量中 16 echo md5($key1); 17 echo md5($key2); 18 if(md5($key1) == md5($key2) && $key1 !== $key2){ 19 echo $flag."取得flag"; 20 } 21 ?>
接下来就很好构造了,这段说的是要构造key1和key2两个变量,又要检查变量名中有没有key,如果有要替换为空,所以通过kkeyey1和kkeyey2绕过。
其中key1和key2的值不可以相同,但md5值要相同,此处有两种构造方式:
可以将key1和key2赋值成md5值为0e开头的字符串(0e=0x10n,所以会被判定为相等),比如输入
http://123.206.87.240:8002/web16/?kkeyey1=QNKCDZO&kkeyey2=240610708
由于md5无法处理数组,但php又不会抛出异常,只会返回false,所以可以将key1和key2赋值乘数组,比如
http://123.206.87.240:8002/web16/?kkeyey1[]=abc&kkeyey2[]=123
两种方法都能得到flag,但返回值不同(0e方法会同时返回两个key变量的md5值)
原文:https://www.cnblogs.com/ctf-love/p/12780807.html