Skip to content

Commit 5eba98b

Browse files
authored
Merge pull request #5760 from kingthorin/xxe-example
2 parents b261996 + ae3c3c5 commit 5eba98b

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

addOns/ascanrules/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ All notable changes to this add-on will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
55

66
## Unreleased
7-
7+
### Changed
8+
- The XML External Entity Attack scan rule now include example alert functionality for documentation generation purposes (Issue 6119).
89

910
## [68] - 2024-09-24
1011
### Changed

addOns/ascanrules/src/main/java/org/zaproxy/zap/extension/ascanrules/XxeScanRule.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import java.io.IOException;
2323
import java.text.MessageFormat;
24+
import java.util.List;
2425
import java.util.Map;
2526
import java.util.regex.Matcher;
2627
import java.util.regex.Pattern;
@@ -325,12 +326,7 @@ private void localFileInclusionAttack(HttpMessage msg) {
325326
String response = msg.getResponseBody().toString();
326327
Matcher matcher = LOCAL_FILE_PATTERNS[idx].matcher(response);
327328
if (matcher.find()) {
328-
newAlert()
329-
.setConfidence(Alert.CONFIDENCE_MEDIUM)
330-
.setAttack(payload)
331-
.setEvidence(matcher.group())
332-
.setMessage(msg)
333-
.raise();
329+
createAlert(payload, matcher.group()).setMessage(msg).raise();
334330
}
335331
if (isStop()) {
336332
return;
@@ -383,12 +379,7 @@ private boolean localFileReflectionTest(HttpMessage msg, String requestBody) {
383379
String response = msg.getResponseBody().toString();
384380
Matcher matcher = LOCAL_FILE_PATTERNS[idx].matcher(response);
385381
if (matcher.find()) {
386-
newAlert()
387-
.setConfidence(Alert.CONFIDENCE_MEDIUM)
388-
.setAttack(payload)
389-
.setEvidence(matcher.group())
390-
.setMessage(msg)
391-
.raise();
382+
createAlert(payload, matcher.group()).setMessage(msg).raise();
392383
return true;
393384
}
394385
if (isStop()) {
@@ -405,4 +396,25 @@ static String createTagSpecificLfrPayload(String requestBody, Matcher tagMatcher
405396
sb.append(requestBody.substring(tagMatcher.end(1)));
406397
return sb.toString();
407398
}
399+
400+
private AlertBuilder createAlert(String attack, String evidence) {
401+
return newAlert()
402+
.setConfidence(Alert.CONFIDENCE_MEDIUM)
403+
.setAttack(attack)
404+
.setEvidence(evidence);
405+
}
406+
407+
@Override
408+
public List<Alert> getExampleAlerts() {
409+
return List.of(
410+
createAlert(
411+
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
412+
+ "<!DOCTYPE foo [\n"
413+
+ " <!ELEMENT foo ANY >\n"
414+
+ " <!ENTITY zapxxe SYSTEM \"file:///etc/passwd\">\n"
415+
+ "]>\n"
416+
+ "<comment><text>&zapxxe;</text></comment>",
417+
"root:*:0:0")
418+
.build());
419+
}
408420
}

addOns/ascanrules/src/test/java/org/zaproxy/zap/extension/ascanrules/XxeScanRuleUnitTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse;
2323
import static org.hamcrest.MatcherAssert.assertThat;
2424
import static org.hamcrest.Matchers.equalTo;
25+
import static org.hamcrest.Matchers.hasSize;
2526
import static org.hamcrest.Matchers.is;
2627

2728
import fi.iki.elonen.NanoHTTPD;
@@ -314,6 +315,20 @@ void shouldAlertOnlyIfCertainTagValuesArePresent()
314315
assertThat(alert.getConfidence(), equalTo(Alert.CONFIDENCE_MEDIUM));
315316
}
316317

318+
@Test
319+
void shouldHaveExpectedExampleAlert() {
320+
// Given / When
321+
List<Alert> alerts = rule.getExampleAlerts();
322+
// Then
323+
assertThat(alerts, hasSize(1));
324+
}
325+
326+
@Test
327+
@Override
328+
public void shouldHaveValidReferences() {
329+
super.shouldHaveValidReferences();
330+
}
331+
317332
private static NanoServerHandler createNanoHandler(
318333
String path, NanoHTTPD.Response.IStatus status, String responseBody) {
319334
return new NanoServerHandler(path) {

0 commit comments

Comments
 (0)