簡體   English   中英

來自 Linux 中的 shell 腳本的輸出重定向一旦從 PHP 的 exec() 調用就被重定向到奇怪的位置

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM