Java Checkmarx-如何验证和清理HttpServletRequest.getInputStream以通过Checkmarx扫描
以下是问题的细节 无限制文件上传 源对象:请求(第39行) 目标对象:getInputStream(行号-41) 请求对象在checkmarx工具中高亮显示-Java Checkmarx-如何验证和清理HttpServletRequest.getInputStream以通过Checkmarx扫描,java,spring-boot,security,sonarqube,checkmarx,Java,Spring Boot,Security,Sonarqube,Checkmarx,以下是问题的细节 无限制文件上传 源对象:请求(第39行) 目标对象:getInputStream(行号-41) 请求对象在checkmarx工具中高亮显示- 如何正确验证、筛选、转义和/或编码用户可控制的输入,以通过Checkmarx扫描?似乎扫描程序在您的代码中发现了XSS漏洞 从OWASP的: 跨站点脚本(XSS)攻击是一种注入类型,其中 恶意脚本被注入到其他良性且可信的系统中 网站。当攻击者使用web应用程序攻击时,就会发生XSS攻击 发送恶意代码,通常以浏览器端脚本的形式, 给不同的最
如何正确验证、筛选、转义和/或编码用户可控制的输入,以通过Checkmarx扫描?似乎扫描程序在您的代码中发现了XSS漏洞 从OWASP的: 跨站点脚本(XSS)攻击是一种注入类型,其中 恶意脚本被注入到其他良性且可信的系统中 网站。当攻击者使用web应用程序攻击时,就会发生XSS攻击 发送恶意代码,通常以浏览器端脚本的形式, 给不同的最终用户。允许这些攻击成功的缺陷包括 非常广泛,并且发生在web应用程序使用来自的输入的任何地方 未经验证或编码而生成的输出中的用户 它 要深入了解如何避免跨站点脚本漏洞,强烈建议查看OWASP。 这里列出了一些消毒剂选项,您可以根据特定语言和相关用途进行选择
祝你好运。有时,我们可以通过某种程度的间接操作来欺骗工具。你能试试下面的方法看看能不能解决你的问题 替换:
authorights creds=new ObjectMapper().readValue(req.getInputStream(),authorights.class);
有,
authorights creds=new ObjectMapper().readValue(req.getReader().lines().collect(collector.joining(System.lineSeparator())),authorights.class);
这对我很有效-检查并传递此高漏洞
我使用了@reflexans和@tgdavies comment的组合
@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()));
}
您可以将代码重构为如下所示:
// Negative
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
throws AuthenticationException, IOException, ServletException {
if (req.getContentLength() > MAX_REQUEST_SIZE) {
throw new IOException("request body size too big!");
}
Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);
return getAuthenticationManager()
.authenticate(new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
}
}
您可以使用getContentLength
作为验证器。默认情况下,CxSAST 9.3无法检测此验证器。您可以通过此文件中的内容覆盖Java_低可见性/无限制文件上传查询:
还支持其他验证器,
getSize
,getFileSize
。您还可以将MultipartConfig
注释与maxRequestSize
一起使用。或者在web.xml中使用multipart config
max request size
。您的问题有点宽泛,但我假设您具体指的是请求对象。验证、筛选或转义的内容取决于您正在使用和处理的HttpServletRequest的哪个属性。介意再分享一些代码吗?@RomanCanlas添加了更多代码片段供参考。关于代码的上下文,我认为这是一个误判。这里的明显来源是request.getHeader(“Authorization”),其中Checkmarx怀疑是恶意输入的入口点,但该令牌似乎不会呈现在会导致XSSY的页面上。在使用输入流之前,您可以尝试检查内容类型header是否为application/json,但是如果没有更多关于Checkmarx查找内容的信息,就很难说了。if(req.getHeader(“Content Type”)==null | | |!req.getHeader(“Content Type”).startsWith(“application/json”)}{//返回400个结果}但是你确实需要弄清楚Checkmarx期望的是什么。让我试试你的解决方案。仅供参考-Checkmarx检查函数输入参数的整个流程。在你的解决方案中,验证/编码/过滤未使用。请解释一下,间接性将如何欺骗工具大多数代码扫描工具依赖于标准patterns并基于已知模式检测错误。在您的情况下,将原始输入流发送到方法是一个确定的红色标志。期望您在开始解析数据之前解析输入。这些间接模式将是非标准模式,因此允许您通过测试。我们仅在确定它是假阳性时才使用它。是否为fix问题?尚未应用您的代码更改。正在等待我的早期代码更改报告。FYI-String inputStreamStr=IOUtils.toString(req.getInputStream(),StandardCharsets.UTF_8.name());inputStreamStr=SecurityUtil.sanitizeObject(inputStreamStr,String.class);InputStream InputStream=new ByteArrayInputStream(inputStreamStr.getBytes());授权creds=new ObjectMapper().readValue(inputStream,授权.class);
// Negative
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
throws AuthenticationException, IOException, ServletException {
if (req.getContentLength() > MAX_REQUEST_SIZE) {
throw new IOException("request body size too big!");
}
Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);
return getAuthenticationManager()
.authenticate(new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
}
}