如何验证和清理httpservletrequest.getinputstream以通过checkmarx扫描

9vw9lbht  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(695)

以下是无限制文件上载的问题详细信息
源对象:req(第39行)
目标对象:getinputstream(第41行)

public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter
{

    //...
38 public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
39            throws AuthenticationException, IOException, ServletException
40    {
41        Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);

        return getAuthenticationManager().authenticate(
                new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
    }
    //...
}

请求对象在checkmarx工具中高亮显示-
如何正确验证、过滤、转义和/或编码用户可控制的输入以通过checkmarx扫描?

vof42yt1

vof42yt11#

这对我来说很管用-通过这个高度的脆弱性
我使用了@reflexans和@tgdavies注解的组合

@Override
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
        throws IOException
{
    int len = req.getContentLength();
    len = Integer.parseInt(Encode.forHtml(String.valueOf(len)));
    String type = req.getContentType();
    type =  Encode.forHtml(type);
    Entitlements creds;
    if(len == INPUT_LENGTH && type.equals(MIMETYPE_TEXT_PLAIN_UTF_8)) {
        creds = new ObjectMapper().readValue(req.getReader().lines().collect(Collectors.joining(System.lineSeparator())), Entitlements.class);
    }else{
        creds = new Entitlements();
    }

    return getAuthenticationManager().authenticate(
            new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
}
eqfvzcg8

eqfvzcg82#

似乎扫描程序在你的代码中发现了xss漏洞。
从owasp的跨站点脚本(xss)页面:
跨站点脚本(xss)攻击是一种注入类型,其中恶意脚本被注入其他良性和可信的网站。当攻击者使用web应用程序向不同的最终用户发送恶意代码(通常以浏览器端脚本的形式)时,就会发生xss攻击。允许这些攻击成功的缺陷非常普遍,并且出现在web应用程序在其生成的输出中使用来自用户的输入而没有对其进行验证或编码的任何地方。
要深入了解如何避免跨站点脚本漏洞,非常建议您查看owasp的xss(跨站点脚本)预防备忘页。这里列出了一些消毒剂选项,您可以根据特定语言和相关用途进行选择。
祝你好运。

chhkpiq4

chhkpiq43#

有时,我们可以通过某种程度的间接操作来欺骗工具。你能试试下面的方法看看能不能解决你的问题,
替换:

Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);

用,

Entitlements creds = new ObjectMapper().readValue(req.getReader().lines().collect(Collectors.joining(System.lineSeparator())), Entitlements.class);

相关问题