我为客户的网站构建了一个自定义主题,我猜它会被黑客入侵。我发现的是每个主题文件和插件顶部的一堆乱码。它都是超级压缩的,不易读,但它看起来像一堆数字。它没有在网站上输出任何内容。我知道它发生的唯一原因是因为向插件添加代码会破坏插件并且WP会自动禁用它。这发生了大约5或6次。
第二次我意识到默认设置没有削减它。所以我安装了WordFence,并且它运行了一个月。 WordFence开始描绘出在任何特定时刻对网站进行了多少次攻击的图片。这太疯狂了。我还更改了所有密码(用户,FTP等),更改了表格前缀,阻止了wp-admin并使用了不同的URL来访问破折号,并且几乎跟随了Hardening Wordpress文章中的每一项。还在这里接受了一些帖子的建议。
虽然看起来一无所获。经过一个月的成功,插件和我的措施停止了工作。无用的字符串开始出现在主题文件的顶部。但奇怪的是,不是插件文件。我解决了问题并尝试了iThemes安全套件而不是WordFence。不!醒来发现该网站再次被黑客入侵。
除了上述内容之外,我还将我的插件列表缩小到选定的受信任的少数几个已经证明在其他网站上无害的:强大的和高级自定义字段。我担心我在某个主题中搞砸了一些东西,但是我已经编了十几个左右,而且从来没有在任何这些网站上遇到过这个问题。
我不知道该怎么做。我觉得如果我理解了' hack'我是否能够更好地对抗它,但我感到茫然。这些东西很难谷歌。任何指导都将不胜感激。
答案 0 :(得分:8)
我曾经在服务器中发现这个问题,我最终制作了一个bash脚本,查找此代码只删除每个受感染的PHP文件的顶行。它解决了这个问题。
我放在这里,所以你可以用它来摆脱恶意代码,但记得试着找出服务器是如何被黑客攻击的,这样你就不会再被黑了。
在bash shell中使用非常简单:
测试是否存在受感染的文件
./remove_malware.sh /var/www/wp_path/
清理受感染的文件
./remove_malware.sh /var/www/wp_path/ clean
脚本(remove_malware.sh
):
#!/bin/bash
#
# This script remove malware of PHP files.
#
# In this case it will remove some malicious code
# from all Wordpress PHP files that is at top of
# every PHP file.
#
# The string at the top of every file is:
#
# <?php if(!isset($GLOBALS["\x61\156\x75\156\x61"])) { $ua=strtolower($_SERVER["\x48\124\x54\120\x5f\125\x53\105\x52\137\x41\107\x45\116\x54"]); if ((! strstr($ua,"\x6d\163\x69\145")) and (! strstr($ua,"\x72\166\x3a\61\x31"))) $GLOBALS["\x61\156\x$
#
# This script tries to find the string inside $_SERVER
# of the above line at the top of the files to determine
# if the file is infected. If you run the script and
# nothing seems to be infected but you suspect and you
# want to be sure, just open any PHP of Wordpress and
# check if the malicious line code is present. If is
# present but the script did not detect, it is because
# the content inside $_SERVER may be diferent.
# In these cases, just replace in this script the string
# in the -e parameter of grep line with the content of
# $_SERVER found in your PHP (remember to escape
# the \ with \\\\) and run again this removal script.
#
#
# JavocSoft 2014
#
if [[ -z "$1" ]]; then
echo "Directory where to find is required."
else
grep -rnwl $1 --include \*.php -e "\\\\x48\\\\124\\\\x54\\\\120\\\\x5f\\\\125\\\\x53\\\\105\\\\x52\\\\137\\\\x41\\\\107\\\\x45\\\\116\\\\x54" | while read -r filename ; do
if [[ ! -z "$2" ]]; then
echo "Found file $filename. Cleaning..."
awk 'BEGIN {matches=0} matches < 1 && /1/ { sub(/^.*<?php/,"<?php"); matches++ } { print $0 }' $filename > $filename.purged
mv $filename $filename.bck
mv $filename.purged $filename
else
echo "Found file $filename."
fi
done
echo "Done."
fi
答案 1 :(得分:2)
缩小范围的一种方法是print_r(我相信它的hex_values) 从您的pastebin:
$ _ SERVER [&#34; \ X48 \ 124 \ X54 \ 120 \ X5F \ 125 \ X53 \ 105 \ X52 \ 137 \ X41 \ 107 \ X45 \ 116 \ X54&#34;]
print_r(\x48\124\x54\120\x5f\125\x53\105\x52\137\x41\107\x45\116\x54);
输出:
$_SERVER["HTTP_USER_AGENT"];
代码的这一小部分记录在official manual:
中&#39; HTTP_USER_AGENT&#39; User-Agent的内容:来自当前的标头 请求,如果有的话。这是表示用户代理的字符串 正在访问该页面。一个典型的例子是:Mozilla / 4.5 [en](X11; U; Linux 2.2.9 i586)。除此之外,你可以使用它 使用get_browser()来定义页面的输出到 用户代理的功能。
要完成整个代码需要一段时间,因为有些&#34; gibberish&#34;嵌入在其他功能中。
一点警告,我不是安全专家,也不是php向导,在测试任何代码时尝试在线沙箱,如http://sandbox.onlinephpfunctions.com/