PHP jailing任意代码

时间:2012-05-14 18:12:11

标签: php security jail

我们有一个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

顺便说一句,没有真正的敏感信息被曝光,因为整个事情都在VM中,所以它不是“定时炸弹”或任何东西。我们仍然希望将其锁定。

2 个答案:

答案 0 :(得分:4)

这听起来像是在漏勺中堵了一个洞。文件系统安全性应由操作系统处理,而不是应用程序。就/etc/passwd而言,操作系统已经确保了它。

这是我/etc/passwd的第一行 - 是的,我将公开发布:

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

通常,密码实际上并未存储在/etc/passwd中。用户信息是,但密码替换为x,真实密码仅供root用户使用。

但是,你应该在一定程度上锁定PHP。您可以在运行时使用ini_set更改许多PHP选项,包括open_basedirhttp://www.php.net/manual/en/ini.core.php#ini.open-basedir

答案 1 :(得分:-4)

如果您只想限制文件读取,这可能会有所帮助 http://www.php.net/manual/en/ini.core.php#ini.open-basedir

如果您使用旧版本的php&lt; 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

中折旧/删除