#php #security #lighttpd
#php #Безопасность #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 (фиктивной) оболочкой:
[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
Но я все еще могу выполнять команды оболочки через функцию system() php (например)!
В моем php.ini нет функций disable_functions. Если я выполняю system(«whoami») или system («id») через php, я получаю следующее:
http
uid=33(http) gid=33(http) groups=33(http)
(так и должно быть).
По какой причине я могу выполнять команды от пользователя с /bin/false в качестве оболочки?
Ответ №1:
/bin/false здесь не при чем. Вы не можете контролировать доступ к системным командам, изменяя оболочку пользователя, потому что они просто НЕ выполняются через оболочку. Подробнее читайте здесь .
Комментарии:
1. О, я этого не знал. Спасибо, я запомню!
Ответ №2:
Как явно сказано в документации, php — это system
просто привязка к системе на C. Из справочной страницы system:
system() выполняет команду, указанную в command , путем вызова
/bin/sh -c command
…
/bin/false
это просто оболочка входа (используется совместно с login
telnet, ssh и т.д.).