PHP тюрьмы произвольного кода

У нас есть Java-приложение IRC, где пользователям разрешено выполнять произвольный PHP и получать результат. Вот один пример того, для чего это используется:

btc: <php>$btc = json_decode(file_get_contents('https://btc-e.com/api/2/1/ticker'), true); $ticker = $btc['ticker']; echo "Current BTC Ticker: High: $".$ticker['high']." Low: $".$ticker['low']." Average: $" . $ticker['avg'];

У нас также есть настройка на python, но нам нравится PHP, потому что PHP нигде не требует перевода строки в коде. (Поскольку это IRC, мы не можем дать ему новые строки, если мы не запустим загруженный через Интернет файл.py)

Вопрос в том, как предотвратить попытки людей использовать систему, например:

<php>echo readfile("/etc/passwd");

Который, несомненно, прочитал бы файл passwd для всеобщего обозрения.
У нас также есть эта проблема после того, как мы попытались заблокировать readfile():

<php>$rf = readfile; echo $rf("/etc/passwd");

Как мы должны обеспечить безопасность этой системы? (Полный код на github, для всех заинтересованных: https://github.com/clone1018/Shocky)

Кроме того, никакая настоящая конфиденциальная информация не раскрывается, поскольку все это находится в виртуальной машине, поэтому она не является "бомбой замедленного действия" или чем-то еще. Мы все еще хотим заблокировать это все же.

2 ответа

Решение

Это звучит как пробка одного отверстия в дуршлаге. Безопасность файловой системы должна осуществляться ОС, а не приложением. И насколько /etc/passwd идет, ОС уже обеспечивает его.

Вот первая строка моего /etc/passwd - да, я собираюсь опубликовать это публично:

root:x:0:0:root:/root:/bin/bash

Обычно пароли на самом деле не хранятся в /etc/passwd, Информация о пользователе есть, но пароли заменены на x, с реальным паролем, доступным только пользователю root.

Тем не менее, вы должны заблокировать PHP до некоторой степени. Вы можете изменить многие параметры PHP во время выполнения с ini_set, в том числе open_basedir, http://www.php.net/manual/en/ini.core.php

Если вы хотите ограничить только чтение файла, может быть, это поможет http://www.php.net/manual/en/ini.core.php

Если вы используете старую версию php < 5.4, вы можете рассмотреть возможность использования безопасного режима php

http://php.net/manual/en/ini.sect.safe-mode.php

Установите следующие переменные для безопасного режима, чтобы ограничить php

safe_mode_exec_dir
disable_functions = readfile,system

и многие другие

Также пользователь не сможет прочитать любой файл, для которого uid отличается, например / etc / password. Имейте в виду, что безопасный режим устарел / удален из последних версий php

Другие вопросы по тегам