地址来源于乌云知识库,作者z_zz_zzz
web.xml的配置:
<servlet> <description></description> <display-name>DownloadAction</display-name> <servlet-name>DownloadAction</servlet-name> <servlet-class>com.oboi.DownloadAction.DownloadAction</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadAction</servlet-name> <url-pattern>/DownloadAction</url-pattern> </servlet-mapping>
其中的servlet类要换下。类的代码如下:
public class DownloadAction extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String rootPath = this.getServletContext().getRealPath("/"); String filename = request.getParameter("filename"); if (filename == null) filename = ""; filename = filename.trim(); InputStream inStream = null; byte[] b = new byte[1024]; int len = 0; try { if (filename == null) { return; } // 读到流中 // 本行代码未对文件名参数进行过滤,存在任意文件下载漏洞 //如果有指定后缀名好像也不能截断 inStream = new FileInputStream(rootPath + "/" + filename); // 设置输出的格式 response.reset(); response.setContentType("application/x-msdownload"); response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); // 循环取出流中的数据 while ((len = inStream.read(b)) > 0) { response.getOutputStream().write(b, 0, len); } response.getOutputStream().close(); inStream.close(); } catch (Exception e) { e.printStackTrace(); } } }
JDK1.5-1.7存在0x00导致的文件名截断问题,与操作系统无关。冒号在Windows环境会导致文件名截断问题,与JAVA无关。
如果要修复这种漏洞的话,可以用文章中讲的。
在生成File对象后,使用getCanonicalPath获取当前文件的真实路径,判断文件是否在允许下载的目录中,若发现文件不在允许下载的目录中,则拒绝下载。
if (!pathname.getCanonicalPath().startsWith(rootPath)){ System.out.println("禁止目录穿越下载"); }
这里记录一下,如果是JAVA写的网站遇到任意文件读取,怎么扩大战果?下载配置文件,有框架的话下载框架配置文件。比如:WEB-INF/web.xml
通过下载的配置文件去读class文件,然后通过jad反编译出代码来。
读到servlet-class 以后通过WEB-INF/classes/com/oboi/DownloadAction/DownloadAction.class 就能读到类了。
未完待续。。。