连接 PHP 中的函数以在 URL 中使用

Concatenate functions in PHP to use in an URL

我正在对 Web 应用程序进行渗透测试,我需要将两个函数连接成一个 URL。 (是的,我已经检查过了this one and this one

我将采用完全相同的代码,因为我不明白为什么像这样的合法问题没有正确答案。 (psst,这与后门或其他东西无关)

<?php 
    if(isset($_GET['function'])){ 
        $_GET['function'](); 
    } 
?> 

有没有可能创造这样的东西? http://localhost/?function=shell_exec('ls') AND phpinfo

感谢您的帮助,我希望这次有人会认真对待一个合法的问题,而不是无缘无故地否决它。

这看起来非常危险。您可以为每个函数传递一个用分号分隔的字符串,如下所示 :

http://localhost/?function=shell_exec('ls');phpinfo

因此您的实际代码将变为:

if(isset($_GET['function'])){ 
        $functions =  explode(';',$_GET['function']); 
        foreach($functions as $function){ 
                $function(); 
        } 
} 

您也可以使用eval函数:

http://localhost/?function=?eval=shell_exec('ls');phpinfo();

后跟 eval($_GET['eval']);,如以下评论中所建议。

这里有两个问题,我先回答问题

为什么不把它做成一个数组呢?

Url:

http://localhost/?function[]=phpinfo&function[]=bob

代码:

$functions = (array)$_GET['function'];
foreach($functions as $function) {
    $function();
}

第二个问题是您不能像上面那样轻松地传递参数。您可能需要先做一些正则表达式,但随后您就如履薄冰了。

这是一个很大的猜测,但类似于:

$matches = [];
preg_match('/(\w+)\(('?(\w+)'?,?)+\)/', $functions, $matches);

然后您应该能够提取函数名称和参数(只要它们是字符串)并使用参数调用函数。但是那个正则表达式显然是狡猾的:/