我们有一个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中,所以它不是“定时炸弹”或任何东西。我们仍然希望将其锁定。
答案 0 :(得分:4)
这听起来像是在漏勺中堵了一个洞。文件系统安全性应由操作系统处理,而不是应用程序。就/etc/passwd
而言,操作系统已经确保了它。
这是我/etc/passwd
的第一行 - 是的,我将公开发布:
root:x:0:0:root:/root:/bin/bash
通常,密码实际上并未存储在/etc/passwd
中。用户信息是,但密码替换为x
,真实密码仅供root用户使用。
但是,你应该在一定程度上锁定PHP。您可以在运行时使用ini_set
更改许多PHP选项,包括open_basedir
。 http://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
中折旧/删除