【问题标题】:Executing PHP from Perl CGI从 Perl CGI 执行 PHP
【发布时间】:2021-03-22 10:25:01
【问题描述】:

首先,作为背景,我试图在创建新实体时加密我们在服务器上的数据。这是在起源于 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 命令,但不确定这是否是问题所在。据我所知,没有迹象表明权限受到限制。如果有人有任何见解,将不胜感激。如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: php perl cgi


    【解决方案1】:

    几点说明:

    • 向我们展示实际、最小和完整的测试程序及其输出,以便我们了解您在做什么。

    • system 与父程序共享其文件句柄,因此如果外部程序向 STDOUT 发送某些内容,那就是它要去的地方。如果那是在您发送 CGI 标头之前,那么事情就会变得一团糟。

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

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

    一些有助于调试的事情:

    • 制作一个小型 CGI 程序,它只调用另一个您知道应该可以工作的程序,例如 date 或类似的东西。验证您是否可以做到这一点。
    #!/usr/bin/perl
    print "Content-type: text/plain\n\n";
    my $rc = system '/bin/date';
    print "result was <$rc>";
    
    • 然后,运行 php 以显示其版本。验证您是否可以运行 php。
    #!/usr/bin/perl
    print "Content-type: text/plain\n\n";
    my $rc = system '/usr/bin/php', '-v';
    print "result was <$rc>";
    
    • 慢慢增加复杂性。找出停止工作的地方。

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

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 2018-02-08
      • 2016-02-11
      • 2016-09-24
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多