题目源码:
<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){
$aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);
if(preg_match('/pass_the_level_1#/', $aaa)){
echo "here is level 2";
if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
if ($_POST['admin'] == $_POST['root_pwd'])
echo '<p>The level 2 can not pass!</p>';
// START FORM PROCESSING
else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
echo "here is level 3,do you kown how to overcome it?";
if (isset($_POST['level_3'])) {
$level_3 = json_decode($_POST['level_3']);
if ($level_3->result == $result) {
echo "success:".$flag;
}
else {
echo "you never beat me!";
}
}
else{
echo "out";
}
}
else{
die("no");
}
// perform validations on the form data
}
else{
echo '<p>out!</p>';
}
}
else{
echo 'nonono!';
}
echo '<hr>';
}
?>
其实就三个点:
- 换行符绕过
- 数组绕过
- 弱类型比较
换行符绕过:%0a
看正则表达式:preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);
,以^开头,&结尾,表示匹配一行,如果我们使用了换行符,就相当于
实现绕过,然后我们输入?aaa=%0apass_the_level_1%23,绕过第一关,注意#要编码,在url中#有特殊意义,所以要进行编码
sha1数组绕过
如果admin与root_pwd是一个数组,那么返回null
null==null,所以顺利通过第二关
弱类型比较:
据逺神说,true与任何字符串相比较都是true
这道题还有一点就是对json字符串的了解程度,json字符串长什么样子,它解码后长什么样子,并且解码后怎么访问它其中的元素。都要有一定的了解,特别要知道它解码后要怎么访问它的元素,这是这道题目结题的关键,我就是不知道json的访问格式,我还以为是什么原生类反序列化(因为我感觉result.php是什么又不知道,然后我还以为->是反序列里面的东西)…什么鬼啊
最后我们传入level_3={“result”:true}即可