<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_GET['syc'])&&preg_match('/^Welcome to GEEK 2023!$/i', $_GET['syc']) && $_GET['syc'] !== 'Welcome to GEEK 2023!') {
if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024) {
if (isset($_POST['qw']) && $_POST['yxx']) {
$array1 = (string)$_POST['qw'];
$array2 = (string)$_POST['yxx'];
if (sha1($array1) === sha1($array2)) {
if (isset($_POST['SYC_GEEK.2023'])&&($_POST['SYC_GEEK.2023']="Happy to see you!")) {
echo $flag;
} else {
echo "再绕最后一步吧";
}
} else {
echo "好哩,快拿到flag啦";
}
} else {
echo "这里绕不过去,QW可不答应了哈";
}
} else {
echo "嘿嘿嘿,你别急啊";
}
}else {
echo "不会吧不会吧,不会第一步就卡住了吧,yxx会瞧不起你的!";
}
?>该题一个有4个条件,全部满足才可以拿到flag:
1.syc通过正则表达式要严格等于字符串,但是后面又不能等于这个字符串,所以再次思考preg_match中是不区分大小写的,但是后边的判断区分大小写,所以我们通过传入大写的字符串绕过这个条件。
2.lover要小于2023,又要加1后大于2024,这里用到了php语言字符转换时的特点,intval匹配该字符的整形,所以我们通过科学计数法来绕过,2e9在转换后因为是0e所以是0小于2023,但是在后面加1后会转换成2乘10的几次方自然会大于2024,绕过该条件。
3.qw和yss利用php数组的特性简单绕过。
4.SYC_GEEK.2023只要等于Happy to see you!就可以满足判断,但是直接传入的话会成为$_POST['SYC_GEEK_2023'],所以要利用[把前面的_变成让php可以识别的方式。