JAVA常见安全问题复现 - 羊小弟
2018-5-21 15:48:0 Author: www.cnblogs.com(查看原文) 阅读量:5 收藏

地址来源于乌云知识库,作者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 就能读到类了。

未完待续。。。


文章来源: https://www.cnblogs.com/yangxiaodi/p/9067585.html
如有侵权请联系:admin#unsafe.sh