我在CheckMarx安全扫描中遇到此问题:
方法
exec
第 69 行websrcmainjavaabcwebactionsHomeAction.java
获取用户输入CNF_KEY_COSN
元素。然后,此元素的值流经 未经适当审查或验证的代码最终被审查或验证 在方法logException
第 905 行向用户显示websrcmainjavagovabcexternalinfoServiceHelper.java
.这可能会 启用跨站点脚本攻击。
HomeAction.java
第 69 行:
String cosn = (String) request.getParameter(CNF_KEY_CON);
ServiceHelper.java
中的第 905 行仅记录错误:
private static void logException(InfoServiceException exception, String message) {
String newMessage = message + ": " + exception.getMessageForLogging();
try {
log.error(newMessage, exception);
} catch (Exception e) {
// fallback to console
System.out.println("error logging exception ->");
e.printStackTrace(System.out);
System.out.println("exception ->");
System.out.print(newMessage);
if (exception != null) exception.printStackTrace(System.out);
}
}
将HomeAction.java
中的另一个代码块更改为:
if(cosn!= null && cosn.matches("[0-9a-zA-Z_]+")) {
...
}
但这无济于事。如何验证/清理/编码第 69 行。任何帮助都非常感谢。
谢谢
您可以使用 Jsoup 清理 XSS 攻击的字符串,为此有一个clean()
方法。您可以执行以下操作来清理输入:
String sanitizedInput = Jsoup.clean(originalInput, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
Checkmarx 定义了一组可以在系统中检查的消毒剂。
基于您的源代码片段; 我假设; i) 您将"cosn"附加到"消息" ii) 应用程序本质上是基于 Web 的(鉴于 request.getParameter) iii) 消息已显示到控制台或记录到文件中。
您可以考虑使用Google Guava或Apache Commons Test来对输入进行html转义。
import com.google.common.html.HtmlEscapers;
public void testGuavaHtmlEscapers(){
String badInput = "<script> alert me! <script>";
String escapedLocation = HtmlEscapers.htmlEscaper().escape(badInput);
System.out.println("<h1> Location: " + escapedLocation + "<h1>");
}
import static org.apache.commons.text.StringEscapeUtils.escapeHtml4;
public void testHtmlEscapers(){
String badInput = "<script> alert me! <script>";
System.out.println(escapeHtml4(badInput));
}
我还会考虑是否有敏感信息,我应该屏蔽,例如,使用 String.replace。
public void testReplace(){
String email = "some-email@domail.com";
String masked = email.replaceAll("(?<=.).(?=[^@]*?.@)", "*");
System.out.println(masked);
}
以上 3 种消毒方法将类似地工作。
对于XSS,这可能是误报(从技术上讲,在Checkmarx中"不可利用"),具体取决于您处理和显示日志的方式。如果日志在浏览器中显示为 html,那么从此应用程序的角度来看,它可能容易受到盲 XSS 的攻击,但它在任何将日志显示为 html 的组件中都是一个漏洞,而不是在上面的代码中。
与其他答案相反,您不应在此处对消息进行编码。无论您使用哪种技术进行日志记录,当然都必须正确编码以供自己使用(例如,如果将其存储为JSON,则数据必须进行JSON编码),但这与XSS无关,也与此问题无关。
这只是原始数据,您可以按原样存储原始数据。如果在此处对其进行编码,将很难以任何其他方式显示它。例如,如果您应用 html 编码,则只能以 html 显示它(或者您必须解码,这将否定任何效果)。这没有意义。如果您在浏览器中显示这些日志,则会出现 XSS - 在这种情况下,无论显示什么内容,它都必须正确编码,但这里的情况并非如此。
但请注意,它仍然可能是一个日志注入漏洞。确保无论以何种方式存储日志,该日志存储 **确实* 应用必要的编码。如果是文本文件,您可能希望删除换行符,以便无法将假行添加到日志中。如果是 json,则需要编码为 json,依此类推。但这是日志工具的一个功能,而不是上面的代码。