作者:[局外人]

分类:[技术分析]

标签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 结果

大家多多尝试一下有没有更好的方法吧!

互动环节

  • 各位大佬们是否有更优的实现方式?欢迎分享代码
  • 评论区聊聊吧~