diff --git a/addOns/ascanrules/CHANGELOG.md b/addOns/ascanrules/CHANGELOG.md index cb603ea4cd8..6b72cf8ff0c 100644 --- a/addOns/ascanrules/CHANGELOG.md +++ b/addOns/ascanrules/CHANGELOG.md @@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - The Cloud Metadata Potentially Exposed scan rules now has a CWE reference. - Scan rules which execute time based attacks now include the "TEST_TIMING" alert tag. - The XPath Injection scan rule now supports error patterns provided via the Custom Payloads add-on (Issue 8958). A minimum of Custom Payloads 0.15.0 is required to take advantage of this optional functionality. +- The Cross Site Scripting scan rule has been updated for additional coverage of JavaScript eval situations. ## [72] - 2025-06-20 ### Added diff --git a/addOns/ascanrules/src/main/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRule.java b/addOns/ascanrules/src/main/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRule.java index f75bb8d95a7..84b3b37c90c 100644 --- a/addOns/ascanrules/src/main/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRule.java +++ b/addOns/ascanrules/src/main/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRule.java @@ -74,6 +74,7 @@ public class CrossSiteScriptingScanRule extends AbstractAppParamPlugin ALERT_TAGS = Collections.unmodifiableMap(alertTags); } + protected static final String GENERIC_ALERT = "alert(1)"; protected static final String GENERIC_SCRIPT_ALERT = ""; protected static final String GENERIC_ONERROR_ALERT = ""; protected static final String IMG_ONERROR_LOG = ""; @@ -729,6 +730,12 @@ private boolean performScriptAttack(HtmlContext context, HttpMessage msg, String return true; } } + List contexts3 = performAttack(msg, param, GENERIC_ALERT, null, 0); + if (contexts3 != null && !contexts3.isEmpty()) { + if (processContexts(contexts3, param, GENERIC_ALERT, false)) { + return true; + } + } return false; } diff --git a/addOns/ascanrules/src/test/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRuleUnitTest.java b/addOns/ascanrules/src/test/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRuleUnitTest.java index 8b28fe6147f..84d754d0fb5 100644 --- a/addOns/ascanrules/src/test/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRuleUnitTest.java +++ b/addOns/ascanrules/src/test/java/org/zaproxy/zap/extension/ascanrules/CrossSiteScriptingScanRuleUnitTest.java @@ -2670,6 +2670,41 @@ protected Response serve(IHTTPSession session) { assertThat(alertsRaised.get(0).getConfidence(), equalTo(Alert.CONFIDENCE_MEDIUM)); } + @Test + void shouldReportXssInSriptAttackInEval() throws NullPointerException, IOException { + // Given + String test = "/shouldReportXssInSriptAttackInEval/"; + + this.nano.addHandler( + new NanoServerHandler(test) { + @Override + protected Response serve(IHTTPSession session) { + String q = getFirstParamValue(session, "q"); + String response; + if (q != null) { + // Make the eye catchers fail + response = getHtml( + "InputInScriptEval.html", + new String[][] {{"q", q}}); + } else { + response = getHtml("NoInput.html"); + } + return newFixedLengthResponse(response); + } + }); + + HttpMessage msg = this.getHttpMessage(test + "?q=sample"); + this.rule.setConfig(new ZapXmlConfiguration()); + // When + this.rule.init(msg, this.parent); + this.rule.scan(); + // Then + assertThat(alertsRaised.size(), equalTo(1)); + assertThat(alertsRaised.get(0).getParam(), equalTo("q")); + assertThat(alertsRaised.get(0).getAttack(), containsString("alert(1)")); + assertThat(alertsRaised.get(0).getConfidence(), equalTo(Alert.CONFIDENCE_MEDIUM)); + } + @Override protected Path getResourcePath(String resourcePath) { return super.getResourcePath("crosssitescriptingscanrule/" + resourcePath); diff --git a/addOns/ascanrules/src/test/resources/org/zaproxy/zap/extension/ascanrules/crosssitescriptingscanrule/InputInScriptEval.html b/addOns/ascanrules/src/test/resources/org/zaproxy/zap/extension/ascanrules/crosssitescriptingscanrule/InputInScriptEval.html new file mode 100644 index 00000000000..9f68b11c538 --- /dev/null +++ b/addOns/ascanrules/src/test/resources/org/zaproxy/zap/extension/ascanrules/crosssitescriptingscanrule/InputInScriptEval.html @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file