[英]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.