作者:[局外人]
分类:[技术分析]
标签:CTF SHOW
刷题
新手
阅读时长:约 [2] 分钟
引言(前言)
日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!
CTFSHOW WEB137
1.1 题目及分析
highlight_file(__FILE__);
class ctfshow
{function __wakeup(){die("private class");}static function getFlag(){echo file_get_contents("flag.php");}
}call_user_func($_POST['ctfshow']);
- 题目分析
- 此题是一个PHP知识的科普。
1.2 思路
在 PHP 中,call_user_func()
是一个内置函数,用于动态调用回调函数。它允许你通过函数名、类方法名或匿名函数等形式的回调,来间接执行对应的函数或方法。
基本语法
call_user_func(callable $callback, mixed ...$args): mixed
- 参数:
$callback
:要调用的回调函数(可以是普通函数名、类静态方法、对象方法、匿名函数等)。...$args
:可选参数,传递给回调函数的参数(按顺序传递)。
- 返回值:返回回调函数的执行结果。
常见用法示例
1. 调用普通函数
// 定义一个普通函数
function greet($name) {return "Hello, $name!";
}// 使用 call_user_func 调用
$result = call_user_func('greet', 'PHP');
echo $result; // 输出:Hello, PHP!
2. 调用类的静态方法
class Math {public static function add($a, $b) {return $a + $b;}
}// 调用静态方法(两种写法)
$result1 = call_user_func(['Math', 'add'], 2, 3);
$result2 = call_user_func('Math::add', 4, 5);echo $result1; // 输出:5
echo $result2; // 输出:9
3. 调用对象的实例方法
class Greeting {public function sayHello($name) {return "Hello, $name!";}
}// 创建对象
$greeting = new Greeting();// 调用实例方法
$result = call_user_func([$greeting, 'sayHello'], 'World');
echo $result; // 输出:Hello, World!
4. 调用匿名函数
// 定义匿名函数
$multiply = function($a, $b) {return $a * $b;
};// 调用匿名函数
$result = call_user_func($multiply, 3, 4);
echo $result; // 输出:12
注意事项
- 当传递参数给回调函数时,
call_user_func()
会按顺序传递参数,与call_user_func_array()
(接收数组形式的参数)不同。 - 对于类方法,回调格式需使用数组
[类名/对象, 方法名]
或字符串类名::方法名
(静态方法)。 - 如果回调不存在,会抛出
Warning
错误。
适用场景
- 动态执行函数(例如根据变量值决定调用哪个函数)。
- 框架或库中需要灵活接收用户自定义回调时(如钩子、事件处理)。
- 简化代码中条件判断调用不同函数的逻辑。
此题playload,POST:ctfshow=ctfshow::getFlag
最后的结果在源代码中。
1.3 结果
大家多多尝试一下有没有更好的方法吧!
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~