我使用OpenBSD和PHP
作为我的私人主页。出于教学目的(不要在生产中使用它),我必须尝试在chroot
中执行一个简单的Hello World
程序。静态链接二进制文件。但我总是得到的结果127
(命令未找到)。
如何在PHP中执行命令:
<?php
$output = null;
$result = null;
echo getcwd();
exec("./foo", $output, $result);
var_dump($output);
var_dump($result);
?>
程序./foo
肯定驻留在当前工作目录中。文件权限也正确
C
中的程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
fprintf(stdout, "foo: stdout");
fprintf(stderr, "foo: stderr");
return 42;
}
编制:
$ cc -static -o foo foo.c
PHP输出:
htdocs/example.org/www
array(0) {
}
int(127)
如果程序是动态链接的(缺少共享库),我可以理解这种行为。
是否在OpenBSD的默认配置中启用了特定的安全功能,该功能不允许PHP执行二进制文件,或者有人可以解释为什么这不起作用?
也没有禁用/etc/php-8.0.ini
中的exec()
功能。
我找到解决办法了。
在OpenBSD的默认配置中,httpd
和PHP
在chroot
中运行。将使用默认目录/var/www
,/var/www/bin
中只有少数应用程序。默认的shell也丢失了,不幸的是PHP的exec
需要shell。因此错误127
(command not found)。
一个快速而肮脏的解决方案是复制chroot:
中的/bin/sh
(它是静态链接的)$ cp /bin/sh /var/www/bin
现在PHP的exec
命令应该可以在OpenBSD上工作。