Web2
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-01-16 15:42:02
# @Last Modified by: h1xa
# @Last Modified time: 2022-01-24 22:14:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
session_start();
error_reporting(0);
include "flag.php";
if(count($_POST)===1){
extract($_POST);
if (call_user_func($$$$$${key($_POST)})==="HappyNewYear"){
echo $flag;
}
}
?>
第一个if语句,count() 函数返回数组中元素的数目。
call_user_func — 把第一个参数作为回调函数调用。
题目中有一个session_start(),所以可以利用session_id ,他会返回PHPSESSID的值,设定一下PHPSESSID为Happynewyear。
这样让session_id作为唯一一个参数第一个if可以通过,而且在第二个if中call_user_func调用session_id可以返还Happynewyear。
然后POST:session_id=session_id,得到flag
Web3
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-01-16 15:42:02
# @Last Modified by: h1xa
# @Last Modified time: 2022-01-24 22:14:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
error_reporting(0);
include "flag.php";
$key= call_user_func(($_GET[1]));
if($key=="HappyNewYear"){
echo $flag;
}
die("虎年大吉,新春快乐!");
call_user_func;
call_user_func — 把第一个参数作为回调函数调用
第一个变量代表是调用的函数,搜了之后我还是不会,不太理解。
看了一位大佬的博客。
本题主要是绕过==,返回ture即可绕过if语句。
想返回ture,就要用到session_start
session_start — 启动新会话或者重用现有会话
成功开始会话返回 true ,反之返回 false
所以通过call_user_func来调用session_start让其返还ture。
Payload:?1=session_start