[英]Output redirection from shell script in Linux is redirected to weird location once called from PHP's exec()
有一个 shell (bash) 脚本,运行在 CentOS 上,SELinux 设置为 Permissive,它只有一个目的 - 向文件写入一些内容:
[root@centos ~]$ cat /var/www/html/test.php
<?php
$output=shell_exec("/opt/sms/script.sh");
var_dump($output);
?>
[root@centos ~]$ cat /opt/sms/script.sh
#!/bin/bash
whoami > /tmp/a.txt
cat /tmp/a.txt
[root@centos ~]$ php -f /var/www/html/test.php
string(5) "root
"
[root@centos ~]$
到目前为止一切都很好! 但是现在让我们通过 PHP 的 exec 调用它,使用 Apache,您将在浏览器中获得以下内容:
string(7) "apache "
在你这样做之前这仍然很好:
[root@centos ~]$ cat /tmp/a.txt
root
[root@centos ~]$
什么?
然后你这样做:
[root@centos ~]$ find / -name a.txt 2>/dev/null
/tmp/systemd-private-689e87297de1452e98dcfaa5bd686a1f-httpd.service-gMJKi0/tmp/a.txt
/tmp/a.txt
[root@centos ~]$ cat /tmp/systemd-private-689e87297de1452e98dcfaa5bd686a1f-httpd.service-
gMJKi0/tmp/a.txt
apache
[root@centos ~]$ cat /tmp/a.txt
root
[root@centos ~]$
问题:为什么将输出写入该/tmpp/systemd-*/tmp.a.txt
文件而不是简单的/tmp/a.txt
? 我提供了绝对路径,它应该用于非常明显的目的。 它是如何/在哪里控制的,我的输出写在其他地方?
这通常被称为“chroot jail”,在chroot
系统调用(和 shell 命令)之后,它允许您将进程的根目录设置为其他内容。 这有效地将进程隔离到某个子目录中。 所有绝对路径都将相对于该根目录进行解释。
这是一种经典且众所周知的安全技术。 如果您的某个 PHP 脚本可被利用,攻击者在名义上将被限制在处理 chroot jail 中的文件,同时将系统的其余部分隔离。
( systemd
可能使用 Linux 命名空间而不是chroot
本身,但想法是一样的)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.