Httpd + / bin / false == system()?

时间:2011-10-06 20:09:37

标签: php security lighttpd

我有两个网络服务器,都在Lighttpd + php上(通过fastCGI)。

[user@box ~]$ lighttpd -v
lighttpd/1.4.29 (ssl) - a light and fast webserver
Build-Date: Aug  7 2011 10:52:01
[user@box ~]$ php -v
PHP 5.3.8 with Suhosin-Patch (cli) (built: Sep 30 2011 05:34:36) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
[user@box ~]$ php-cgi -v
PHP 5.3.8 with Suhosin-Patch (cgi-fcgi) (built: Sep 30 2011 05:35:14)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

Lighttpd和php-cgi在用户“http”下使用 / bin / false (伪造)shell运行:

[user@box ~]$ cat /etc/passwd | grep http
http:x:33:33:http:/srv/http:/bin/false
[user@box ~]$ ps aux | grep "lighttpd\_php-cgi"
http      1291  0.0  1.1   5152  2816 tty1     S    Oct06   0:00 /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf
http      1292  0.0  1.5  14476  3904 ?        Ss   Oct06   0:00 /usr/bin/php-cgi

但我仍然可以通过php的 system()函数执行shell命令(例如)!

我的php.ini中没有disable_functions。 如果我通过php执行 system(“whoami”) system(“id”),我会收到以下信息:

http
uid=33(http) gid=33(http) groups=33(http)

(就像它一样)。

我可以用 / bin / false 作为shell执行用户命令的原因是什么?

2 个答案:

答案 0 :(得分:3)

/ bin / false 此处无关。您无法通过更改用户的shell来控制对系统命令的访问,因为它们不是通过shell执行的。阅读更多here

答案 1 :(得分:3)

正如documentation中明确指出的那样,php的system只是C系统的绑定。来自系统的manpage

  

system()通过调用/bin/sh -c command ...

执行命令中指定的命令

/bin/false只是登录shell(与login,telnet,ssh等一起使用。)。