【问题标题】:Handling files in Multipart request to fix Struts 1.x vulnerability issue处理 Multipart 请求中的文件以修复 Struts 1.x 漏洞问题
【发布时间】:2014-05-07 15:23:18
【问题描述】:

Struts 1.x 漏洞问题如下所述:

Apache Struts 容易出现安全绕过漏洞,因为它无法充分处理用户提供的输入。攻击者可以利用此问题绕过某些安全限制并执行未经授权的操作。

为了处理多部分请求,我们使用了以下代码:

DiskFileItemFactory factory = new DiskFileItemFactory();
        // Configure a repository (to ensure a secure temp location is
        // used)
        ServletContext servletContext = filterConfig.getServletContext();
        File repository = (File) servletContext.getAttribute( "javax.servlet.context.tempdir" );
        factory.setRepository( repository );// Create a new file upload
        // handler
        ServletFileUpload upload = new ServletFileUpload( factory );
        // Parse the request
        List<FileItem> multipartItems = upload.parseRequest( request );
        // Prepare the request parameter map.
        Map<String, String[]> parameterMap = new HashMap<String, String[]>();
        // Loop through multipart request items.
        for ( FileItem multipartItem : multipartItems )
        {
            if ( multipartItem.isFormField() )
            {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                processFormField( multipartItem, parameterMap );
            }
            else
            {
                // Process form file field (input type="file").
                processFileField( multipartItem, request );
            }
        }

我们将文件字段处理为:

 private void processFileField( FileItem fileField, HttpServletRequest request )
{
    if ( fileField.getName().length() <= 0 )
    {
        // No file uploaded.
        request.setAttribute( fileField.getFieldName(), null );
    }
    else
    {
        // File uploaded with good size.
        request.setAttribute( fileField.getFieldName(), fileField );
    }
}

但是在 Action 类中,当我们尝试检索表单字段时,我们得到了 NULL。我们如何获取表单中的文件字段。

尝试的选项是: 1) 将 multipartItem.setFormField() 设置为 true 2) 设置表单域和非文件参数。

以上都没有帮助。需要想法。

【问题讨论】:

    标签: forms struts multipartform-data


    【解决方案1】:

    您忘记检查请求是否为 maltipart 表单请求。例如

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    

    对于代码 sn-p,您应该查看此答案 File upload with ServletFileUpload's parseRequest

    【讨论】:

    • 仅当请求是多部分表单请求时,我们才使用“DiskFileItemFactory”实现第一段代码。问题中没有提到该代码。我们面临的问题是在 Action 类中检索 FormFile 详细信息。 FormFile 字段似乎被重置了。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2013-06-13
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2014-12-25
    相关资源
    最近更新 更多