由于对上传文件的处理不安全,攻击者能够在我的服务器 (CentOS 5.4) 上运行 php 代码。此问题已修复,但当他连接时,他似乎修改了 root 拥有的文件 (文件权限 644),将其替换为 apache 用户拥有的文件。是否存在可以实现此目的的 apache 或 php 漏洞?
回应第一条要求提供更多信息的评论 - 如果攻击者能够将文件上传到我的服务器,并可能将用户引导到我域上的恶意内容,那么这已经够糟糕了。但是,他/她还能够编辑文件。结果就是我的网站被修改,以便将所有新用户注册信息通过电子邮件发送到 Gmail 地址。
我不知道从哪里开始查找,并请求帮助。除了明显的目录权限(不允许将文件上传到可能执行 php 代码的目录;不要在用户的上传目录中执行 php 代码)之外,我不知道该更改什么以确保这种情况不会再次发生。我的理解是,如果文件归 root 所有,则其他用户都无法更改它。显然事实并非如此。
如果这是您的服务器,您会查看哪里?
答案1
我的理解是,如果文件归 root 所有,则其他用户都无法更改它。显然事实并非如此。
如果该文件的权限可由“组”或“其他”写入,则该组中的任何人(例如“apache”)或任何用户(对于“其他”而言)都可以覆盖它和/或更改所有权。
由于这是文件注入,我要寻找的另一件事是不应该存在的 php 文件,或者您没有创建的文件。它们可能被命名为相对无害的名称,如“index.php”或“help.php”,但如果您查看代码,您会看到大量 base64 编码数据(以掩盖它实际在做什么)。还要查找“wsh.php”。
有时这些文件是用 php 编写的“web shell”,使用 php/apache 进程的权限,提供对文件系统的类似 shell 的访问权限。它们将能够编辑/删除/上传/复制/移动文件,包括由 root 拥有但权限不佳的文件(参见第一段)。
这些文件可能看起来像这样:
<?PHP
//Authentication
$login = ""; //Login
$pass = ""; //Pass
$md5_pass = ""; //If no pass then hash
eval(gzinflate(base64_decode('7b17f9vG0TD6d/v75TusEaYmE5KiZOcmWXJkSY59alt+JLlpXtmH
// etc etc
也许你可以做类似的事情:
find www_root -name '*.php' -exec grep -l 'eval' {} \;
查看这些文件并确保它们是合法的。
答案2
关于如何在将来避免这种情况的一般提示:
修补您的服务器。CentOS 5.4 已经 EoL 很久了。我们目前使用的是 CentOS 5.7!
请注意,PHP 也进行了升级CentOS 5.5。
此次 PHP 升级包含大量安全修复。
对于网络服务器,您应该(至少)使用三个用户和一个组:
根- 主进程的所有者(如果使用非特权端口则不需要)
韋斯萊- 运行 httpd-sub 进程的用户,集团www
管理员- 对网络服务器文件(通常是 htdocs 或你的情况是 php-base-dir)有写权限的用户,集团www。
这集团www应该具有对 htdocs 的读取权限,但没有写入权限。
随意选择您自己的用户/组名,这只是一个示例。
您还可以通过禁止 TRACE、TRACK、PUT 和 DELETE(如果您的应用程序允许)来强化 httpd。这可以通过以下方式实现mod_rewrite。