• JAVA常见安全问题复现


    地址来源于乌云知识库,作者z_zz_zzz

    0x01 任意文件下载

    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 就能读到类了。

    0x02 恶意文件上传

    未完待续。。。

  • 相关阅读:
    Docker学习笔记之常用的 Docker Compose 配置项
    Docker学习笔记之使用 Docker Compose 管理容器
    qt无法使用终端启动的解决方法
    实践卡尔曼滤波--小球追踪
    高斯分布 笔记
    蒙特卡罗定位(Particle Filter Localization)笔记
    珊格地图笔记
    ubuntu14.04 下安装 gsl 科学计算库
    SLAM学习资料汇总
    矩阵的SVD分解
  • 原文地址:https://www.cnblogs.com/yangxiaodi/p/9067585.html
Copyright © 2020-2023  润新知