0

我正在尝试修改 bash 脚本以从大量文件中删除恶意代码。

社区将从中受益,所以这里是:

#!/bin/bash

grep -r -l 'var createDocumentFragm' /home/user/Desktop/infected_site/* > /home/user/Desktop/filelist.txt

for i in $(cat /home/user/Desktop/filelist.txt)
do
   cp -f $i $i.bak
done

for i in $(cat /home/user/Desktop/filelist.txt)
do
   $i | sed 's/createDocumentFragm.*//g' > $i.awk
   awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'

这是脚本与此消息一起爆炸的地方:

+ for i in '$(cat /home/user/Desktop/filelist.txt)'    
+ sed 's/createDocumentFragm.*//g'    
+ /home/user/Desktop/infected_site/index.htm    

我收到 2 个错误,脚本停止。

/home/user/Desktop/infected_site/index.htm: line 1: syntax error near unexpected token `<'    
/home/user/Desktop/infected_site/index.htm: line 1: `<html><head><script>(function (){ '    

我已经完成了前两个部分。

包含 createDocumentfragm 的文件已在文本文件中正确枚举。

textfile.txt 中的文件已被复制,在它们的原始位置添加了一个 .bak IE:infected_site/some_directory/infected_file.htm 和infected_file.htm.bak 有效地确保我们有备份。

我现在需要做的就是编写一个 AWK 命令,该命令将使用 filelist.txt 中的文件列表,使用整个恶意文本作为模式,然后将其从文件中删除。仅使用大写脚本作为起点,小写脚本过于通用,可能会删除合法文本

我怀疑这可能对我有帮助,但我不知道如何正确使用它。

http://backreference.org/2010/03/13/safely-escape-variables-in-awk/

一旦我弄清楚了这部分,并且在您确认文件没有被损坏后,您可以执行此操作来清除 bak 文件:

for i in $(cat /home/user/Desktop/filelist.txt)
do
   rm -f $i.bak
done    

我认为对您来说最好的方法是将您的典型 html 输入替换为这样的 asp 输入并使用客户端 id 模式静态,这样您就不必在 jquery 中替换 id

它可以是这样的

 <asp:TextBox  name="username" type="text"  id="username_id"  title="Username" ClientIDMode="Static" runat="server"></asp:TextBox>  
     <asp:TextBox   name="password" type="password" id="password"   title="Password" ClientIDMode="Static" runat="server"></asp:TextBox> 
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>

和后面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class index : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (username_id.Text == "" || password.Text == "")
            {

                Label1.Text = "Error";

            }
            else
            { 

                    ////

             }

    }
}
4

1 回答 1

2

几件事:

你有:

$i | sed 's/var createDocumentFragm.*//g' > $i.awk

您可能应该是这个意思(使用cat我们稍后将讨论的用法):

cat $i | sed 's/var createDocumentFragm.*//g' > $i.awk

您将文件列表中的每个文件都视为命令而不是文件。

现在,关于您使用cat. 如果您cat几乎没有将多个文件连接在一起,那么您可能正在做一些不太正确的事情。例如,您可以这样做:

sed 's/var createDocumentFragm.*//g' "$i" > $i.awk

我也对这种awk说法感到有些困惑。你到底在哪个文件上使用awk?您的awk语句使用 STDIN 和 STDOUT,因此它从 for 循环中读取文件名,然后在屏幕上打印输出。声明是否sed应该输入到awk声明中?

请注意,我不必将文件打印到 STDOUT,然后将其通过管道传输到 sed。该sed命令可以直接取文件名。

您还希望避免for文件列表上的循环。这是非常低效的,并且可能导致命令行过载的问题。今天不是一个大问题,但会在你最不怀疑的时候影响你。发生的情况是您必须在循环开始$(cat /home/user/Desktop/filelist.txt)之前先执行。for

稍微重写你的程序:

cd ~/Desktop
grep -r -l 'var createDocumentFragm' infected_site/* > filelist.txt

while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" > "$i.awk"
     awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'
done < filelist.txt

我们可以使用一个循环,我们把它做成了一个while循环。我什至可以将 grep 输入到 while 循环中:

grep -r -l 'var createDocumentFragm' infected_site/* | while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" > "$i.awk"
     awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'
done < filelist.txt

然后我什至不必创建临时文件。

让我知道 awk 发生了什么。我怀疑你想要这样的东西:

grep -r -l 'var createDocumentFragm' infected_site/* | while read file
do
     cp -f "$file" "$file.bak"
     sed 's/var createDocumentFragm.*//g' "$file" \
         | awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p' > "$i.awk"
done < filelist.txt

另请注意,我在文件名周围加上引号。如果文件名中有空格,这有助于防止出现问题。

于 2012-04-12T21:03:46.757 回答