2

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

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

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

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

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

4

2 回答 2

1

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

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

网址:

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

代码:

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

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

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

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

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

于 2015-04-16T09:39:50.033 回答
0

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

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']);,如下面的评论中所建议的那样。

于 2015-04-16T09:33:49.743 回答