利用GIf89a标记伪装为图片文件
昨天说到利用C#代码来判断上传文件的真实格式,以免别有用心者通过修改后缀名的手段来上传木马。 不过,在实际运用过程中,发现该方法无法防范利用“GIf89a”标记伪装为图片文件这种手段。只需在asp文件头部加上“GIF89a”这6个字符,即可让上述代码将文件判定为GIF文件,从而进行上传。 目前尚未找到较好的方式来排除这种伪装手段,只能暂时禁止了所有的gif上传,安全为先。*
昨天说到利用C#代码来判断上传文件的真实格式,以免别有用心者通过修改后缀名的手段来上传木马。 不过,在实际运用过程中,发现该方法无法防范利用“GIf89a”标记伪装为图片文件这种手段。只需在asp文件头部加上“GIF89a”这6个字符,即可让上述代码将文件判定为GIF文件,从而进行上传。 目前尚未找到较好的方式来排除这种伪装手段,只能暂时禁止了所有的gif上传,安全为先。*
前段时间,公司的一台服务器遭到了入侵,被当成了肉鸡,攻击者上传了大量的挂马网页。初步判断是通过将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之后,即可正常解压。因此在实际比对的时候,需要注意一下。