zoukankan      html  css  js  c++  java
  • 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 恶意文件上传

    未完待续。。。

  • 相关阅读:
    假期总结三
    假期总结三
    假期总结三
    假期总结三
    Redis 在线管理工具(phpRedisAdmin)介绍 两次git
    Redis 在线管理工具(phpRedisAdmin)介绍 两次git
    Redis 在线管理工具(phpRedisAdmin)介绍 两次git
    Redis 在线管理工具(phpRedisAdmin)介绍 两次git
    进程
    C# exe文件 添加到windows 服务
  • 原文地址:https://www.cnblogs.com/yangxiaodi/p/9067585.html
Copyright © 2011-2022 走看看