Linux 中 shell 脚本的输出重定向被重定向到从 PHP 的 exec() 调用的奇怪位置



有一个shell(bash(脚本,位于CentOS上,SELinux设置为Permission,它只有一个目的-向文件中写入内容:

[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监狱",在chroot系统调用(和shell命令(之后,可以将进程的根目录设置为其他目录。这样可以有效地将进程隔离到某个子目录中。所有绝对路径都将相对于此根目录进行解释。

这是一种经典且众所周知的安全技术。如果您的PHP脚本中有一个是可利用的,那么攻击者名义上将被限制为扰乱chroot监狱中的文件,同时将系统的其他部分隔离。

(systemd可能使用Linux名称空间,而不是chroot本身,但想法是一样的(

最新更新