diff --git a/webgoat-container/src/main/java/org/owasp/webgoat/asciidoc/WebWolfMacro.java b/webgoat-container/src/main/java/org/owasp/webgoat/asciidoc/WebWolfMacro.java index 7f2712d7f..d78d62765 100644 --- a/webgoat-container/src/main/java/org/owasp/webgoat/asciidoc/WebWolfMacro.java +++ b/webgoat-container/src/main/java/org/owasp/webgoat/asciidoc/WebWolfMacro.java @@ -41,7 +41,7 @@ public class WebWolfMacro extends InlineMacroProcessor { * The purpose is to make it possible to use the application behind a reverse proxy. For instance in the docker * compose/stack version with webgoat webwolf and nginx proxy. * You do not have to use the indicated hostname, but if you do, you should define two hosts aliases - * 127.0.0.1 www.webgoat.local www.webwolf.locaal + * 127.0.0.1 www.webgoat.local www.webwolf.local */ private String determineHost(String host, String port) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); diff --git a/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTDecodeEndpoint.java b/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTDecodeEndpoint.java new file mode 100644 index 000000000..63815d87a --- /dev/null +++ b/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTDecodeEndpoint.java @@ -0,0 +1,22 @@ +package org.owasp.webgoat.jwt; + +import org.owasp.webgoat.assignments.AssignmentEndpoint; +import org.owasp.webgoat.assignments.AttackResult; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class JWTDecodeEndpoint extends AssignmentEndpoint { + + @PostMapping("/JWT/decode") + @ResponseBody + public AttackResult decode(@RequestParam("jwt-encode-user") String user) { + if ("user".equals(user)) { + return success(this).build(); + } else { + return failed(this).build(); + } + } +} diff --git a/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTFinalEndpoint.java b/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTFinalEndpoint.java index 44d19a1f2..ec44e9756 100644 --- a/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTFinalEndpoint.java +++ b/webgoat-lessons/jwt/src/main/java/org/owasp/webgoat/jwt/JWTFinalEndpoint.java @@ -84,62 +84,6 @@ public class JWTFinalEndpoint extends AssignmentEndpoint { private JWTFinalEndpoint(DataSource dataSource) { this.dataSource = dataSource; } - - @PostMapping(path="/JWT/encode",produces=MediaType.TEXT_HTML_VALUE) - @ResponseBody - public String encode(@RequestParam("jsonHeader") String jsonHeader, - @RequestParam("jsonPayload") String jsonPayload, - @RequestParam("jsonSecret") String jsonSecret) throws NoSuchAlgorithmException { - - //System.out.println(jsonHeader); - //System.out.println(jsonPayload); - String encodedHeader; - String encodedPayload; - String encodedSignature; - try { - encodedHeader = TextCodec.BASE64URL.encode(jsonHeader); - encodedPayload = TextCodec.BASE64URL.encode(jsonPayload); - if (jsonHeader.toLowerCase().contains("none")) { - encodedSignature=""; - } else { - encodedSignature = TextCodec.BASE64URL.encode(getJWTSignature(jsonHeader, encodedHeader, encodedPayload, jsonSecret)); - } - } catch (Exception e) { - encodedHeader=""; - encodedPayload="signature type not supported in this tool, try jwt.io"; - encodedSignature = ""; - } - String result = "{\"encodedHeader\":\""+encodedHeader+"\",\"encodedPayload\":\""+encodedPayload+"\",\"encodedSignature\":\""+encodedSignature+"\"}"; - //System.out.println(result); - return result; - } - - private byte[] getJWTSignature(String jsonHeader, String encodedHeader, String encodedPayload, String jsonSecret) throws NoSuchAlgorithmException, InvalidKeyException { - String message = encodedHeader+"."+encodedPayload; - String algorithm = "HmacSHA256"; - if (jsonHeader.equals("HS512")) { - algorithm = "HmacSHA512"; - } - Mac macInstance = Mac.getInstance(algorithm); - SecretKeySpec secret_key = new SecretKeySpec(TextCodec.BASE64.decode(jsonSecret), algorithm); - macInstance.init(secret_key); - - return macInstance.doFinal(message.getBytes(StandardCharsets.UTF_8)); - } - - @PostMapping(path="/JWT/decode",produces=MediaType.TEXT_HTML_VALUE) - @ResponseBody - public String decode(@RequestParam("jwtToken") String jwtToken) throws NoSuchAlgorithmException { - try { - String encodedHeader = jwtToken.substring(0, jwtToken.indexOf(".")); - String encodedPayload = jwtToken.substring(jwtToken.indexOf(".")+1, jwtToken.lastIndexOf(".")); - String jsonHeader = TextCodec.BASE64URL.decodeToString(encodedHeader); - String jsonPayload = TextCodec.BASE64URL.decodeToString(encodedPayload); - return "{\"jsonHeader\":\""+jsonHeader.replace("\"", "\\\"")+"\",\"jsonPayload\":\""+jsonPayload.replace("\"", "\\\"").replace("\t","").replace("\r", "").replace("\n", "")+"\"}"; - } catch (Exception e) { - return "{\"jsonHeader\":\"\",\"jsonPayload\":\"\"}"; - } - } @PostMapping("/JWT/final/follow/{user}") public @ResponseBody diff --git a/webgoat-lessons/jwt/src/main/resources/html/JWT.html b/webgoat-lessons/jwt/src/main/resources/html/JWT.html index 27bd0ac89..323832b61 100644 --- a/webgoat-lessons/jwt/src/main/resources/html/JWT.html +++ b/webgoat-lessons/jwt/src/main/resources/html/JWT.html @@ -1,61 +1,39 @@ - - - - -