最近,在我运行 apache 和 php 的某台客户服务器上,我注意到网站上的每个文件夹中都放置了一堆随机文件。它们以随机数字命名,例如 205492.php。
还有一些 .htaccess 文件与这些随机编号的文件一起放置。我的主机告诉我它是客户端在 php 中上传的脚本,但文件的所有者/组设置为 httpd。我认为这意味着是 apache 守护进程将文件放在这里。这些文件的创建时间都设置为完全相同的时间戳。
随机 php 文件中有很多 CURL 和 base64_encode 函数。我确实注意到,为我客户建立网站的人将整个文件夹的 chmod 设置为 777。后来我将其更改为 755,认为这可能是问题所在。
我想知道是否有人听说过类似的事情,以及是否有人有任何建议。非常感谢您抽出时间。
答案1
不仅糟糕的或一般的程序员,优秀的 PHP 程序员也常常忘记安全目标。
虽然这不是板上钉钉的事情,但黑客网站是可以建立的方式引入一些规则更加困难
- 代码/数据/工作文件分割和权限执行
- 代码:保存可执行文件的目录:此目录必须可访问但不得由运行 apache 的用户写入(不同系统中的 www-data 或 httpd)(php_admin_flag 引擎开启)
- 数据:页面附带的 css、图片和静态文件的位置:此目录不得由 Apache 写入或执行(php_admin_flag 引擎关闭)
- 用户可上传文件、临时文件等的目录:此目录可以写入但不得由 Apache 执行(php_admin_flag 引擎关闭)
- 禁用 .htaccess 文件:三分之一的时间里,网站“黑客”只涉及重写 .htaccess 文件,因此这就像权限提升。如果 Apache 不必检查任何 .htaccess 文件是否位于所服务路径的任何级别,则还可以加快 Apache 的速度。
- 在 PHP 中引入非阻碍性限制,例如
- 禁用未使用的功能(系统、开头的 exec),
- 引入 open_basedir (严格规定不允许 php exec 的目录)
- php_admin_flag 引擎在目录 / 中关闭,并且只允许特定目录(或者更好的是特定文件)
- display_errors 严格关闭
- 对于许多虚拟主机网站来说,如果能引入一个 sendmail 包装器,就会变得非常方便,这样就可以给每封外发信件都打上水印,这样就更容易找到哪个虚拟主机向系统发送垃圾邮件
- 当然还要避免一些常见错误,比如包含 GET/POST 变量
一个简单的 sendmail 包装器:
#!/bin/sh
umask 077
TEMP=/tmp
CHROOT=${1:-unspecified}
trap "rm -f msg.$$ ; exit 1" 0 1 2 3 15
rm -f msg.$$ || exit 1;
cat | formail -f -I "X-subsystem-sent: \"$CHROOT\"" >$TEMP/trapmail.$$
exec <$TEMP/trapmail.$$ || exit 1
rm -f $TEMP/trapmail.$$ # safe, we hold the file descriptor
exec /usr/sbin/sendmail -t -i
exit 1
答案2
该网站正在使用的一个文件/库中存在漏洞。该漏洞允许将文件上传到服务器,并且听起来像是放置在任意位置。由于 PHP 以与 apache 相同的用户身份运行,因此所有上传的文件都将归该用户所有。其次,由于文档根目录被 chmoded 为 777,它允许任何系统用户将文件/文件夹写入该路径。
像您一样更改权限级别(chmod 755)将有助于解决该问题,但我建议查看您的日志/代码并消除漏洞或可能的漏洞。
答案3
我的一个网站也遇到过类似的情况。我使用服务器日志和基于 PHP 的 CMS 日志来识别 IP 地址。
使用 .htaccess 文件我添加了以下行(阻止访问点空白)
#Blacklist
RewriteCond %{REMOTE_ADDR} (?:123.123.123.123) [NC]
我用 IP 替换上面的数字(或者如果来自可疑国家/地区,则阻止整个范围),这就是我所做的。成功了。但这只是一个可能的解决方案。希望对您有所帮助!