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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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之后,即可正常解压。因此在实际比对的时候,需要注意一下。