Executing PHP from Perl CGI



首先,作为后台,我试图在创建新实体时加密服务器上的数据。这是在一个遗留系统上,该系统最初是一个Perl CGI系统,并有一个单独的部分,即PHP。Perl部分创建组,后来实现了PHP对其进行加密

我正在尝试从一个Perl CGI文件中执行PHP加密脚本。我尝试过使用:

exec("/path/to/file arg1 arg2")
system("/path/to/file arg1 arg2")
backtick operator /path/to/file arg1 arg2
open ("/path/to/file arg1 arg2 |)

我还尝试直接指向/bin/php,并将该文件作为每个案例的参数进行传递。到目前为止,我唯一发生的事情是:

  1. 正在打印exec/system的输出。。。将Perl文件(甚至不是php文件(生成为文本,我在其他地方没有看到过这种情况,但我看到的只是Perl,而不是CGI和Perl
  2. 没有数据。如果我输出$!在使用系统时,我从Perl中得到了一个非法的查找错误,但其他人将其留空。所有这些都返回0,就好像exec/system/。。。已运行,但服务器端没有任何更改

根据我在网上读到的内容,我认为CGI可能以某种形式运行;"受保护";模式,在某些文件上禁用exec/system/open/backtick命令,但不确定这是问题所在。不过,据我所知,没有迹象表明许可受到限制。如果有人有任何见解,我们将不胜感激。如果你需要更多信息,请告诉我。

几个注意事项:

  • 向我们展示实际的、最小的和完整的测试程序及其输出,这样我们就可以看到您在做什么。

  • system与父程序共享其文件句柄,所以如果外部程序向STDOUT发送了一些内容,那么它就是要发送的。如果那是在你发送CGI标题之前,那么事情就会变得一团糟。

  • backticks将捕获标准输出,但不会捕获标准错误。内容可能仍会进入错误日志。

  • exec将您的程序转换为其他程序。也就是说,你的Perl程序做了一些设置,然后变成了你执行的东西,然后再也不会回来了(除非事情失败了(。

一些有助于调试的东西:

  • 制作一个小的CGI程序,它只需调用另一个您知道应该工作的程序,例如date或类似的程序。验证你能做那么多
#!/usr/bin/perl
print "Content-type: text/plainnn";
my $rc = system '/bin/date';
print "result was <$rc>";
  • 然后,运行php以显示其版本。验证您是否可以运行php
#!/usr/bin/perl
print "Content-type: text/plainnn";
my $rc = system '/usr/bin/php', '-v';
print "result was <$rc>";
  • 慢慢增加复杂性。找出问题的症结所在

如果PHP的参数来自用户输入,请考虑使用污点检查和仔细清理(perlsec(。请注意,我使用了system的列表版本,所以shell没有机会解释元字符。

最新更新