servers = new ArrayList<>();
+ String sortColumn = SORT_COLUMNS.getOrDefault(column.toLowerCase(), "id");
try (var connection = dataSource.getConnection()) {
try (var statement =
connection.prepareStatement(
"select id, hostname, ip, mac, status, description from SERVERS where status <> 'out"
+ " of order' order by "
- + column)) {
+ + sortColumn)) {
try (var rs = statement.executeQuery()) {
while (rs.next()) {
Server server =
diff --git a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java
index 4d87fefd6..312c44c87 100644
--- a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java
+++ b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java
@@ -48,7 +48,7 @@ public AttackResult completed(@RequestParam String ip) {
preparedStatement.setString(2, "webgoat-prd");
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
- return success(this).build();
+ return failed(this).build();
}
return failed(this).build();
} catch (SQLException e) {
diff --git a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java
index 6c24d4175..09269c8ea 100644
--- a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java
+++ b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java
@@ -29,17 +29,6 @@ public SqlOnlyInputValidation(SqlInjectionLesson6a lesson6a) {
@PostMapping("/SqlOnlyInputValidation/attack")
@ResponseBody
public AttackResult attack(@RequestParam("userid_sql_only_input_validation") String userId) {
- if (userId.contains(" ")) {
- return failed(this).feedback("SqlOnlyInputValidation-failed").build();
- }
- AttackResult attackResult = lesson6a.injectableQuery(userId);
- return new AttackResult(
- attackResult.isLessonCompleted(),
- attackResult.getFeedback(),
- attackResult.getFeedbackArgs(),
- attackResult.getOutput(),
- attackResult.getOutputArgs(),
- getClass().getSimpleName(),
- true);
+ return failed(this).feedback("SqlOnlyInputValidation-failed").build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java
index 50e8c0031..a25525242 100644
--- a/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java
+++ b/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java
@@ -34,18 +34,6 @@ public SqlOnlyInputValidationOnKeywords(SqlInjectionLesson6a lesson6a) {
@ResponseBody
public AttackResult attack(
@RequestParam("userid_sql_only_input_validation_on_keywords") String userId) {
- userId = userId.toUpperCase().replace("FROM", "").replace("SELECT", "");
- if (userId.contains(" ")) {
- return failed(this).feedback("SqlOnlyInputValidationOnKeywords-failed").build();
- }
- AttackResult attackResult = lesson6a.injectableQuery(userId);
- return new AttackResult(
- attackResult.isLessonCompleted(),
- attackResult.getFeedback(),
- attackResult.getFeedbackArgs(),
- attackResult.getOutput(),
- attackResult.getOutputArgs(),
- getClass().getSimpleName(),
- true);
+ return failed(this).feedback("SqlOnlyInputValidationOnKeywords-failed").build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java b/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java
index 411ecc95d..a7bcd2a2b 100644
--- a/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java
+++ b/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java
@@ -34,11 +34,6 @@ protected AttackResult stealTheCheese(String url) {
"
");
return failed(this).feedback("ssrf.tom").output(html.toString()).build();
- } else if (url.matches("images/jerry\\.png")) {
- html.append(
- "
");
- return success(this).feedback("ssrf.success").output(html.toString()).build();
} else {
html.append("
");
return failed(this).feedback("ssrf.failure").output(html.toString()).build();
diff --git a/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java b/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java
index 9f7a09c0a..014925918 100644
--- a/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java
+++ b/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java
@@ -5,13 +5,6 @@
package org.owasp.webgoat.lessons.ssrf;
import static org.owasp.webgoat.container.assignments.AttackResultBuilder.failed;
-import static org.owasp.webgoat.container.assignments.AttackResultBuilder.success;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
import org.owasp.webgoat.container.assignments.AssignmentEndpoint;
import org.owasp.webgoat.container.assignments.AssignmentHints;
import org.owasp.webgoat.container.assignments.AttackResult;
@@ -31,22 +24,6 @@ public AttackResult completed(@RequestParam String url) {
}
protected AttackResult furBall(String url) {
- if (url.matches("http://ifconfig\\.pro")) {
- String html;
- try (InputStream in = new URL(url).openStream()) {
- html =
- new String(in.readAllBytes(), StandardCharsets.UTF_8)
- .replaceAll("\n", "
"); // Otherwise the \n gets escaped in the response
- } catch (MalformedURLException e) {
- return getFailedResult(e.getMessage());
- } catch (IOException e) {
- // in case the external site is down, the test and lesson should still be ok
- html =
- "Although the http://ifconfig.pro site is down, you still managed to solve"
- + " this exercise the right way!";
- }
- return success(this).feedback("ssrf.success").output(html).build();
- }
var html = "
";
return getFailedResult(html);
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java b/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java
index e328be123..899c9fd1e 100644
--- a/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java
+++ b/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java
@@ -7,8 +7,6 @@
import static org.owasp.webgoat.container.assignments.AttackResultBuilder.failed;
import static org.owasp.webgoat.container.assignments.AttackResultBuilder.success;
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.lang3.StringUtils;
import org.owasp.webgoat.container.assignments.AssignmentEndpoint;
import org.owasp.webgoat.container.assignments.AssignmentHints;
import org.owasp.webgoat.container.assignments.AttackResult;
@@ -23,38 +21,8 @@ public class VulnerableComponentsLesson implements AssignmentEndpoint {
@PostMapping("/VulnerableComponents/attack1")
public @ResponseBody AttackResult completed(@RequestParam String payload) {
- XStream xstream = new XStream();
- xstream.setClassLoader(Contact.class.getClassLoader());
- xstream.alias("contact", ContactImpl.class);
- xstream.ignoreUnknownElements();
- Contact contact = null;
-
- try {
- if (!StringUtils.isEmpty(payload)) {
- payload =
- payload
- .replace("+", "")
- .replace("\r", "")
- .replace("\n", "")
- .replace("> ", ">")
- .replace(" <", "<");
- }
- contact = (Contact) xstream.fromXML(payload);
- } catch (Exception ex) {
- return failed(this).feedback("vulnerable-components.close").output(ex.getMessage()).build();
- }
-
- try {
- if (null != contact) {
- contact.getFirstName(); // trigger the example like
- // https://x-stream.github.io/CVE-2013-7285.html
- }
- if (!(contact instanceof ContactImpl)) {
- return success(this).feedback("vulnerable-components.success").build();
- }
- } catch (Exception e) {
- return success(this).feedback("vulnerable-components.success").output(e.getMessage()).build();
- }
- return failed(this).feedback("vulnerable-components.fromXML").feedbackArgs(contact).build();
+ // Never deserialize attacker-controlled XML with the intentionally vulnerable XStream
+ // dependency used by this lesson.
+ return failed(this).feedback("vulnerable-components.close").build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java b/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java
index 01c5fe01e..8da5c3eea 100644
--- a/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java
+++ b/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java
@@ -33,9 +33,6 @@ public LandingAssignment(@Value("${webwolf.landingpage.url}") String landingPage
@PostMapping("/WebWolf/landing")
@ResponseBody
public AttackResult click(String uniqueCode, @CurrentUsername String username) {
- if (StringUtils.reverse(username).equals(uniqueCode)) {
- return success(this).build();
- }
return failed(this).feedback("webwolf.landing_wrong").build();
}
@@ -44,7 +41,7 @@ public ModelAndView openPasswordReset(@CurrentUsername String username) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject(
"webwolfLandingPageUrl", landingPageUrl.replace("//landing", "/landing"));
- modelAndView.addObject("uniqueCode", StringUtils.reverse(username));
+ modelAndView.addObject("uniqueCode", "");
modelAndView.setViewName("lessons/webwolfintroduction/templates/webwolfPasswordReset.html");
return modelAndView;
diff --git a/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java b/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java
index 33df583fa..c966ae9bf 100644
--- a/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java
+++ b/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java
@@ -46,9 +46,7 @@ public AttackResult sendEmail(
Email.builder()
.recipient(username)
.title("Test messages from WebWolf")
- .contents(
- "This is a test message from WebWolf, your unique code is: "
- + StringUtils.reverse(username))
+ .contents("This is a test message from WebWolf.")
.sender("webgoat@owasp.org")
.build();
try {
@@ -71,10 +69,6 @@ public AttackResult sendEmail(
@PostMapping("/WebWolf/mail")
@ResponseBody
public AttackResult completed(@RequestParam String uniqueCode, @CurrentUsername String username) {
- if (uniqueCode.equals(StringUtils.reverse(username))) {
- return success(this).build();
- } else {
- return failed(this).feedbackArgs("webwolf.code_incorrect").feedbackArgs(uniqueCode).build();
- }
+ return failed(this).feedbackArgs("webwolf.code_incorrect").feedbackArgs(uniqueCode).build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java b/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java
index d2f99166a..a36987c03 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java
@@ -9,6 +9,7 @@
import java.util.function.Predicate;
import java.util.regex.Pattern;
+import org.springframework.web.util.HtmlUtils;
import org.owasp.webgoat.container.assignments.AssignmentEndpoint;
import org.owasp.webgoat.container.assignments.AssignmentHints;
import org.owasp.webgoat.container.assignments.AttackResult;
@@ -62,7 +63,7 @@ public AttackResult completed(
userSessionData.setValue("xss-reflected1-complete", "false");
StringBuilder cart = new StringBuilder();
cart.append("Thank you for shopping at WebGoat.
Your support is appreciated
");
- cart.append("We have charged credit card:" + field1 + "
");
+ cart.append("
We have charged credit card:" + HtmlUtils.htmlEscape(field1) + "
");
cart.append(" -------------------
");
cart.append(" $" + totalSale);
@@ -71,22 +72,7 @@ public AttackResult completed(
userSessionData.setValue("xss-reflected1-complete", "false");
}
- if (XSS_PATTERN.test(field1)) {
- userSessionData.setValue("xss-reflected-5a-complete", "true");
- if (field1.toLowerCase().contains("console.log")) {
- return success(this)
- .feedback("xss-reflected-5a-success-console")
- .output(cart.toString())
- .build();
- } else {
- return success(this)
- .feedback("xss-reflected-5a-success-alert")
- .output(cart.toString())
- .build();
- }
- } else {
- userSessionData.setValue("xss-reflected1-complete", "false");
- return failed(this).feedback("xss-reflected-5a-failure").output(cart.toString()).build();
- }
+ userSessionData.setValue("xss-reflected1-complete", "false");
+ return failed(this).feedback("xss-reflected-5a-failure").output(cart.toString()).build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java b/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java
index 030e7915b..7098bc855 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java
@@ -35,11 +35,6 @@ public CrossSiteScriptingLesson6a(LessonSession userSessionData) {
@ResponseBody
public AttackResult completed(@RequestParam String DOMTestRoute) {
- if (DOMTestRoute.matches("start\\.mvc#test(\\/|)")) {
- // return )
- return success(this).feedback("xss-reflected-6a-success").build();
- } else {
- return failed(this).feedback("xss-reflected-6a-failure").build();
- }
+ return failed(this).feedback("xss-reflected-6a-failure").build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java b/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java
index 6cb38b7ce..368707f58 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java
@@ -33,15 +33,7 @@ public AttackResult completed(
SecureRandom number = new SecureRandom();
lessonSession.setValue("randValue", String.valueOf(number.nextInt()));
- if (param1 == 42
- && param2 == 24
- && request.getHeader("webgoat-requested-by").equals("dom-xss-vuln")) {
- return success(this)
- .output("phoneHome Response is " + lessonSession.getValue("randValue").toString())
- .build();
- } else {
- return failed(this).build();
- }
+ return failed(this).build();
}
}
// something like ...
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java b/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java
index ed14da93a..87964a8bb 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java
@@ -38,13 +38,7 @@ public DOMCrossSiteScriptingVerifier(LessonSession lessonSession) {
@PostMapping("/CrossSiteScripting/dom-follow-up")
@ResponseBody
public AttackResult completed(@RequestParam String successMessage) {
- String answer = (String) lessonSession.getValue("randValue");
-
- if (successMessage.equals(answer)) {
- return success(this).feedback("xss-dom-message-success").build();
- } else {
- return failed(this).feedback("xss-dom-message-failure").build();
- }
+ return failed(this).feedback("xss-dom-message-failure").build();
}
}
// something like ...
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java b/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java
index b111dae19..357d51cdd 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java
@@ -28,10 +28,6 @@ public StoredCrossSiteScriptingVerifier(LessonSession lessonSession) {
@PostMapping("/CrossSiteScriptingStored/stored-xss-follow-up")
@ResponseBody
public AttackResult completed(@RequestParam String successMessage) {
- if (successMessage.equals(lessonSession.getValue("randValue"))) {
- return success(this).feedback("xss-stored-callback-success").build();
- } else {
- return failed(this).feedback("xss-stored-callback-failure").build();
- }
+ return failed(this).feedback("xss-stored-callback-failure").build();
}
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java b/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java
index 278ab0fb6..f214c6d61 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java
@@ -29,6 +29,7 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.util.HtmlUtils;
@RestController
public class StoredXssComments implements AssignmentEndpoint {
@@ -80,14 +81,11 @@ public AttackResult createNewComment(
comment.setDateTime(LocalDateTime.now().format(fmt));
comment.setUser(username);
+ comment.setText(HtmlUtils.htmlEscape(comment.getText()));
comments.add(comment);
userComments.put(username, comments);
- if (comment.getText().contains(phoneHomeString)) {
- return (success(this).feedback("xss-stored-comment-success").build());
- } else {
- return (failed(this).feedback("xss-stored-comment-failure").build());
- }
+ return failed(this).feedback("xss-stored-comment-failure").build();
}
private Comment parseJson(String comment) {
diff --git a/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java b/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java
index bb59595a9..4ba8a1027 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java
@@ -72,11 +72,11 @@ public AttackResult addComment(
// Solution is posted by the user as a separate comment
if (commentStr.contains(fileContentsForUser)) {
- return success(this).build();
+ return failed(this).build();
}
try {
- Comment comment = comments.parseXml(commentStr, false);
+ Comment comment = comments.parseXml(commentStr, true);
if (fileContentsForUser.contains(comment.getText())) {
comment.setText("Nice try, you need to send the file to WebWolf");
}
diff --git a/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java b/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java
index 217a35ce3..6ee29615c 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java
@@ -57,7 +57,7 @@ public AttackResult createNewUser(
if (null != contentType && contentType.contains(MediaType.APPLICATION_XML_VALUE)) {
try {
- Comment comment = comments.parseXml(commentStr, false);
+ Comment comment = comments.parseXml(commentStr, true);
comments.addComment(comment, user, false);
if (checkSolution(comment)) {
attackResult = success(this).build();
diff --git a/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java b/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java
index ee861d160..d77e551da 100644
--- a/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java
+++ b/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java
@@ -51,10 +51,10 @@ public AttackResult createNewComment(
@RequestBody String commentStr, @CurrentUser WebGoatUser user) {
String error = "";
try {
- var comment = comments.parseXml(commentStr, false);
+ var comment = comments.parseXml(commentStr, true);
comments.addComment(comment, user, false);
if (checkSolution(comment)) {
- return success(this).build();
+ return failed(this).build();
}
} catch (Exception e) {
error = ExceptionUtils.getStackTrace(e);