ctfshow新春欢乐赛某些题解
-
web2
源码如下:点击查看代码
<?php 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; } } ?>
可以POST传一个数组进去,而$$$$$${key($_POST)}这一段代码实际就是获得传进来的数组的key,也就是键值的值...然后作为call_user_func函数的参数。而我们需要该参数可控,可以传入一对键值相等的数组不就可以达到目的了,比如传入1=1,那么最后该参数一定是1,看到代码中有个session_start();,看了下cookie有个PHPSESSID,想到session_id()函数:
那么我们可以修改PHPSESSID=HappyNewYear,然后上传session_id=session_id就可以通过if了,下面是调试环节:
这是我修改一点后的本地复现代码:
点击查看代码
<?php
highlight_file(__FILE__);
session_start();
error_reporting(0);
$flag=123;
$sid = session_id();
if(count($_POST)===1){
extract($_POST);
$func = $$$$$${key($_POST)};
if (call_user_func($func)==="HappyNewYear"){
echo $flag;
}
}
传入参数:
可以清楚看到每个环节的变量的值