前段时间,公司的一台服务器遭到了入侵,被当成了肉鸡,攻击者上传了大量的挂马网页。初步判断是通过将asp文件伪装为图片文件后,通过上传漏洞,将木马文件上传到服务器。 针对这个问题,我们需要对文件的真实格式进行判断,而不仅仅是看一下后缀名。代码如下:

static void Main(string[] args)
    {
        string path = @"C:\假图片.jpg";
        System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        System.IO.BinaryReader r = new System.IO.BinaryReader(fs);
        string bx = " ";
        byte buffer;
        try
        {
            buffer = r.ReadByte();
            bx = buffer.ToString();
            buffer = r.ReadByte();
            bx += buffer.ToString();
        }
        catch (Exception exc)
        {
            Console.WriteLine(exc.Message);
        }
        r.Close();
        fs.Close();
        //真实的文件类型
        Console.WriteLine(bx);
        //文件名,包括格式
        Console.WriteLine(System.IO.Path.GetFileName(path));
        //文件名, 不包括格式
        Console.WriteLine(System.IO.Path.GetFileNameWithoutExtension(path));
        //文件格式
        Console.WriteLine(System.IO.Path.GetExtension(path));
        Console.ReadLine();
    }

以上方法可以获得文件真实格式的编码,然后再通过编码与格式名的对应关系,即可获得文件的真实格式。以下是编码与后缀名对应的枚举类:

    public enum FileExtension
    {
        JPG = 255216,
        GIF = 7173,
        BMP = 6677,
        PNG = 13780,
        COM = 7790,
        EXE = 7790,
        DLL = 7790,
        RAR = 8297,
        ZIP = 8075,
        XML = 6063,
        HTML = 6033,
        ASPX = 239187,
        CS = 117115,
        JS = 119105,
        TXT = 210187,
        SQL = 255254,
        BAT = 64101,
        BTSEED = 10056,
        RDP = 255254,
        PSD = 5666,
        PDF = 3780,
        CHM = 7384,
        LOG = 70105,
        REG = 8269,
        HLP = 6395,
        DOC = 208207,
        XLS = 208207,
        DOCX = 208207,
        XLSX = 208207,
    }

在实际使用过程中我发现,DOCX格式的文件会被判断为ZIP格式,这是由于微软对DOCX格式的特性调整所致,而实际上,将DOCX文档后缀名改为ZIP之后,即可正常解压。因此在实际比对的时候,需要注意一下。