打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
shiro安全框架扩展教程--上传文件的安全控制

           相信每一个项目都会存在文件上传功能,最常见的就是图片,音频,视频等上传,但是如果用户多的应用都会存在用户恶意上传动作,包括伪装成可上传文件,

按照我们以往的方式,普通地判断后缀名,那是不可行,除了一些内部系统可以这样简单的玩耍,那对外的互联网应用项目是不够严格的


下面举例个简单的攻击


1. 我们的上传代码中只判断了,request里面的文件类型

2. 恶意用户把一个jsp文件,修改了头文件信息,这样就可以骗过浏览器上传过程中是显示文件是image/jpeg

3. 然后文件就可以直接保存成功了,很明显这是由于服务端判断不严谨导致的,用户访问xxxx路径下的上传jsp文件然后就可以执行jsp里面的脚本,你的资料基本就泄漏的差不多了


然后下面如果说是加个后缀名判断,也差不多可以这样绕过


我们都知道文件都有所谓的文件头信息,但是除了jsp,txt等一些特殊的是没有固定的,所以我们要排除这些


下面看看一些常用的文件头信息匹配


  1.               fileHeaderType.put(".jpg", "FFD8FF"); // JPEG (jpg)  
  2. fileHeaderType.put(".png", "89504E47"); // PNG (png)  
  3. fileHeaderType.put(".gif", "47494638"); // GIF (gif)  
  4. fileHeaderType.put(".tif", "49492A00"); // TIFF (tif)  
  5. fileHeaderType.put(".bmp", "424D"); // Windows Bitmap (bmp)  
  6.   
  7. fileHeaderType.put(".zip", "504B0304");  
  8. fileHeaderType.put(".rar", "52617221");  
  9. fileHeaderType.put(".7z", "377abcaf");  
  10.   
  11. fileHeaderType.put(".xls", "D0CF11E0");  
  12. fileHeaderType.put(".xlsx", "504b030414");  
  13. fileHeaderType.put(".doc", "D0CF11E0");   
  14. fileHeaderType.put(".docx", "504b0304");   
  15.   
  16. fileHeaderType.put(".dwg", "41433130"); // CAD (dwg)  
  17. fileHeaderType.put(".html", "68746D6C3E"); // HTML (html)  
  18. fileHeaderType.put(".rtf", "7B5C727466"); // Rich Text Format (rtf)  
  19. fileHeaderType.put(".xml", "3C3F786D6C");  
  20.   
  21. fileHeaderType.put(".psd", "38425053"); // Photoshop (psd)  
  22. fileHeaderType.put(".eml", "44656C69766572792D646174653A"); // Email  
  23.   
  24. fileHeaderType.put(".dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)  
  25. fileHeaderType.put(".pst", "2142444E"); // Outlook (pst)  
  26.   
  27. fileHeaderType.put(".mdb", "5374616E64617264204A"); // MS Access (mdb)  
  28. fileHeaderType.put(".wpd", "FF575043"); // WordPerfect (wpd)  
  29. fileHeaderType.put(".eps", "252150532D41646F6265");  
  30. fileHeaderType.put(".ps", "252150532D41646F6265");  
  31. fileHeaderType.put(".pdf", "255044462D312E"); // Adobe Acrobat (pdf)  
  32. fileHeaderType.put(".qdf", "AC9EBD8F"); // Quicken (qdf)  
  33. fileHeaderType.put(".pwl", "E3828596"); // Windows Password (pwl)  
  34. fileHeaderType.put(".wav", "57415645"); // Wave (wav)  
  35. fileHeaderType.put(".avi", "41564920");  
  36. fileHeaderType.put(".ram", "2E7261FD"); // Real Audio (ram)  
  37. fileHeaderType.put(".rm", "2E524D46"); // Real Media (rm)  
  38. fileHeaderType.put(".mpg", "000001BA"); //      
  39. fileHeaderType.put(".mov", "6D6F6F76"); // Quicktime (mov)  
  40. fileHeaderType.put(".asf", "3026B2758E66CF11"); // Windows Media (asf)  
  41. fileHeaderType.put(".mid", "4D546864"); // MIDI (mid)  

如何使用呢?我们应该读取文件的前面一些字节,然后匹配这些固定的字符串,如果可以匹配上那证明是合法的


  1. /** 获取文件头 */  
  2.     private static String getFileHeader(File file, int byteSize) throws IOException {  
  3.   
  4.         InputStream in = new FileInputStream(file);  
  5.   
  6.         byte[] b = new byte[byteSize];  
  7.         in.read(b, 0, b.length);  
  8.   
  9.         if (b == null || b.length <= 0) {  
  10.             return null;  
  11.         }  
  12.   
  13.         StringBuffer buffer = new StringBuffer();  
  14.   
  15.         for (int i = 0, len = b.length; i < len; i++) {  
  16.             int v = b[i] & 0xFF;  
  17.             String hv = Integer.toHexString(v);  
  18.             if (hv.length() < 2) {  
  19.                 buffer.append(0);  
  20.             }  
  21.             buffer.append(hv);  
  22.         }  
  23.         return buffer.toString().toLowerCase();  
  24.     }  


然后使用对应的类型和对应的文件头信息匹配,但是有个比较麻烦的问题,如果图片把jpg后缀改成png,应该算是正常合法的,所以这个时候应该把当前后缀全部匹配下图片的魔数

如果找到一个合法则认为通过,这样处理应该是比较正确的


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java 通过流的方式读取远程图片并显示在jsp页面(类型以jpg、png等结尾的图片)
GIF动画制作大全
Struts第3天补充
根据文件头数据判断文件类型
JSP中使用注释
中文化和国际化问题权威解析之三:Java中文问题分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服