处理Multipart请求中的文件以修复Struts 1.x漏洞问题

时间:2014-05-07 15:23:19

标签: forms struts multipartform-data

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)设置表单字段和非文件参数。

以上都没有帮助。需要创意。

1 个答案:

答案 0 :(得分:0)

您忘记检查请求是否是多部分表单请求。例如

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

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