Joomla 网站被黑了?

Joomla Site Hacked?

我们有一段时间没有接触过我们的 Joomla 网站了。当我去添加新内容时,我们遇到了以下问题。初始页面显示正常,但无论何时单击任何菜单项或 link,我们都会显示以下俄语文本:

Иайл ключевиков keys/sharperdevelopment.com.txt пуст или не существует。 Пропишите туда хотя бы один ключевик.

转换为:

文件关键字keys/sharperdevelopment.com.txt为空或不存在。规定至少一个关键字。

有人知道这是黑客问题还是配置问题吗?网页上的查看源显示没有其他 HTML 只是上面显示的文本。

我们的 Joomla 版本刚刚升级为:Joomla! 3.4.8 稳定 该网站是SharperDevelopment.com

当然,这是在我们遇到新的潜在客户之前发生的。如有任何帮助或建议,我们将不胜感激。

如果您的网站在更新之前遭到黑客攻击,您将需要梳理文件系统以查找已修改 and/or 添加的文件。

上传 Joomla 3.4.8 的全新副本无法解决此问题。

我假设 linux 因为那是我 运行 的时候。我管理多个 LAMP 服务器,每个服务器托管多个域。

保存备份并将其标记为已感染。这样做是因为该站点虽然已被感染但仍在运行。

第一件事...

run tail -f path/to/logs/* | grep POST 

您需要查看谁在您网站上发布奇怪的文件。 关闭自动换行。 发布到的每个发现都需要直观地查看。 joomla 文件以 <?php\n 开头,然后注释 header。如果您看到一串 PHP 代码,则需要将其删除。

这是我经常看到的发布到的一些文件的列表。

nnnnnnnnnnnnnnnnn.php
alias.php
article.php
css.php
blog66.php
defines.php < Joomla file that has been modified.
dirs.php
footer4.php
functions14.php
global.php
lib87.php
trust.php
functions.php

/includes/defines.php 不应该是一个长文件。如果你看到 //istart 那么你需要删除从那一点开始的所有内容。

您需要对使用 eval 或 GLOBAL 的文件进行 grep。还应检查 istart。这些命令很可能会输出大量数据,因此将其通过管道传输到 less。

find /home -iname \*.php | xargs pcregrep -M "^<?php.*\n.*fun"
find /home/ -iname \*.php | xargs grep "eval("
find ./ -iname \*.php | xargs grep "globals"

管到 less 这样的作品。

find ./ -name \*.php | xargs grep -r "eval(" | less
grep -r "eval(" | less

您将查找包含这样但更长的编码字符串的文件:(发布的代码无效)1ktebHkKHMh7oMftoPA4evcfEoVJs4sUmcTtLCl5Jq0IGoKAUnbzDC1f6C2rJpduyVxvDvRsEztPwSUb6ey73tAVtx8A6BPK+SwyqR/edx3BsfPnmsfbwCFG2kYk

很多时候文件会以 eval base64_decode 和 gzuncompress 结束。

许多合法文件使用 eval 和 base64 解码。如果您看到一个非常长的编码数据块,它很可能是恶意文件。一段时间后,您将能够看到看起来不正确的图案。

一些文件可能也有 google 机器人的用户代理。我最近一直看到这个所以寻找字符串 googlebot

以下字符串的 grep 文件。

74.125
lnkfarm.pw   # this is an actual host. It has been reported to Interpol

您可以备份您获得的任何文件,并根据 joomla 的 github 存储库检查它们。

https://github.com/joomla/joomla-cms

同时检查 mailq 是否有由垃圾邮件机器人引起的延迟邮件,这就是许多这些文件的用途..

我还添加了如下 iptables 规则来最初阻止它。

-A INPUT -p tcp -m tcp --dport 80 -m string --string "POST /libraries/joomla/exporter.php" --algo bm --to 90 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 80 -m string --string "POST /modules/bmvlfj.php" --algo bm --to 90 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 80 -m string --string "POST /modules/7595mb.php" --algo bm --to 90 -j REJECT --reject-with icmp-port-unreachable

可能还有很多其他方法可以搜索恶意文件,但这是我现在拥有的方法。

清除所有恶意文件后,进行备份,然后更新所有扩展。之后我会再次检查您的文件并将 Joomla 文件的新副本加载到您的网站上,然后在您的网站目录中搜索最旧的文件。

确定一切正常后,更改所有密码并进行备份。不要在本地存储备份。

补充回答,也许对你有帮助:

您的问题:

Joomla Site Hacked?

尝试 Eyesite 扩展。它为您的 J!网站目录树和以后,如果有任何变化,它 e-mails 你直到你协调变化。 (多久一次,这取决于您 – 您使用 cron 设置检查时间表。)这样您就可以收到预警,尤其是在像您这样的网站上,在很长一段时间内变化最少。

我很好奇你发现了什么?我有一个在 3.4.7 之后启动的 Joomla 3 站点(我认为 .8 在 .7 之后很快就出现了,我认为它可能是一个修复程序)。我在这里学到了什么 >>> http://forum.joomla.org/viewtopic.php?f=706&t=902833

根据这些信息,我关闭了 SEF,网站运行正常(好吧,不太好,因为我想使用 SEF)。

我也担心被黑,但该线程上的其他发帖人似乎认为这是托管问题(我们使用的是 BH)。

更新:好像有人在我找到解决方案后发帖。

http://forum.joomla.org/viewtopic.php?f=706&t=902833#p3352730

这修复了我的网站。干杯!

如果您 运行 您自己的服务器,您可以使用 incrond 实时监控文件更改。您将需要编写一个脚本来生成要监视的目录列表:

PARAM="IN_CREATE,IN_DELETE,IN_MODIFY,IN_MOVED_FROM,IN_MOVED_TO,IN_ATTRIB"
CMD='/path/to/mail/script file change detected in: $@/$# with event [$%]|Web files changed'
OUTPUT=/etc/incron.d/www-changes
WEBROOT=/var/www

# generate config
find $WEBROOT -type d -print0 | xargs -0 -I{} echo "{} $PARAM $CMD" > $OUTPUT

如果您不 block front end access 访问不应浏览的目录,您将被黑客入侵。以下目录应阻止前端访问:

bin|cli|components|includes|language|layouts|libraries|logs|plugins|tmp

您还应该禁用 运行前端可访问目录中的脚本:

images|media|modules|templates

然后您可以使用 incrond 监控错误日志以获取对禁止文件的访问并阻止攻击者。

使用来自 I-Blocklist with ipset will also help. I block approximately 120,000 abusive ip's in a fraction of a second. It is also useful to block tor nodes 的列表。

如果您使用 ipset,您应该将阻止规则放在 iptables raw table 以获得更好的性能而不是 input & output table 许多指南显示不正确。

运行 Hiawatha Webserver作为网络服务器或反向代理也会阻止很多攻击。

您的 /var/www 应该安装 noexec,nosuid 以防止攻击者 运行 上传他们设法上传的脚本。

使用 php-fpm 中的 chroot 功能来限制攻击者可用的文件。要在 chroot 运行 中找到 dns 分辨率所需的文件列表:

strace php /path/to/file-below

<?php
header( "Content-Type: text/plain" );
echo( gethostbyname( "google.com" )."\n" );
print_r( getdate() );
?>