package servlets.module.lesson; import static org.junit.jupiter.api.Assertions.fail; import dbProcs.GetterIT; import dbProcs.Setter; import java.io.IOException; import java.sql.SQLException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletConfig; import testUtils.TestProperties; public class XssLessonIT { private static String lang = "en_GB"; private static final Logger log = LogManager.getLogger(XssLessonIT.class); private static String applicationRoot = new String(); private MockHttpServletRequest request; private MockHttpServletResponse response; /** Creates DB or Restores DB to Factory Defaults before running tests */ @BeforeAll public static void resetDatabase() throws IOException, SQLException { TestProperties.setTestPropertiesFileDirectory(log); TestProperties.createMysqlResource(); TestProperties.ensureSchemaReady(log); TestProperties.reseedTestData(); } @BeforeEach public void setup() { request = new MockHttpServletRequest(); response = new MockHttpServletResponse(); // Open All modules if (!Setter.openAllModules(applicationRoot, false) && !Setter.openAllModules(applicationRoot, true)) { fail("Could not Mark All Modules As Open"); } } public String getModuleDoPost(String searchTerm, String csrfToken, int expectedResponseCode) throws Exception { try { String servletClassName = "XssLesson"; log.debug("Creating " + servletClassName + " Servlet Instance"); XssLesson servlet = new XssLesson(); servlet.init(new MockServletConfig(servletClassName)); // Setup Servlet Parameters and Attributes log.debug("Setting Up Params and Atrributes"); request.addParameter("searchTerm", searchTerm); // Adding Correct CSRF Token (Token Submitted) request.addParameter("csrfToken", csrfToken); log.debug("Running doPost"); servlet.doPost(request, response); if (response.getStatus() != expectedResponseCode) { fail( servletClassName + " Servlet Returned " + response.getStatus() + " Code. " + expectedResponseCode + " Expected"); } else { log.debug("302 OK Detected"); log.debug( servletClassName + " Successful, returning location retrieved: " + response.getContentAsString()); return (response.getContentAsString()); } } catch (Exception e) { throw e; } return null; } @Test public void testLevelValidAnswerScriptTags() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = ""; String servletResponse = getModuleDoPost(xssString, csrfToken, 302); if (servletResponse.contains("You must be getting funky")) { String message = new String("General 'Funky' Error Detected"); log.fatal(message); fail(message); } if (!servletResponse.contains("The result key for this lesson is")) { String message = new String("Valid Solution did not yeild Result Key"); log.fatal(message); fail(message); } if (!servletResponse.contains(xssString)) { String message = new String("Xss String Not Reflected in Response"); log.fatal(message); fail(message); } } } catch (Exception e) { log.fatal("Could not Complete: " + e.toString()); fail("Could not Complete: " + e.toString()); } } @Test public void testLevelValidAnswerImgTags() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = ""; String servletResponse = getModuleDoPost(xssString, csrfToken, 302); if (servletResponse.contains("You must be getting funky")) { String message = new String("General 'Funky' Error Detected"); log.fatal(message); fail(message); } if (!servletResponse.contains("The result key for this lesson is")) { String message = new String("Valid Solution did not yeild Result Key"); log.fatal(message); fail(message); } if (!servletResponse.contains(xssString)) { String message = new String("Xss String Not Reflected in Response"); log.fatal(message); fail(message); } } } catch (Exception e) { log.fatal("Could not Complete: " + e.toString()); fail("Could not Complete: " + e.toString()); } } @Test public void testLevelValidAnsweriFrameTags() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = ""; String servletResponse = getModuleDoPost(xssString, csrfToken, 302); if (servletResponse.contains("You must be getting funky")) { String message = new String("General 'Funky' Error Detected"); log.fatal(message); fail(message); } if (!servletResponse.contains("The result key for this lesson is")) { String message = new String("Valid Solution did not yeild Result Key"); log.fatal(message); fail(message); } if (!servletResponse.contains(xssString)) { String message = new String("Xss String Not Reflected in Response"); log.fatal(message); fail(message); } } } catch (Exception e) { log.fatal("Could not Complete: " + e.toString()); fail("Could not Complete: " + e.toString()); } } @Test public void testLevelValidAnswerAnchorTags() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = "click me"; String servletResponse = getModuleDoPost(xssString, csrfToken, 302); if (servletResponse.contains("You must be getting funky")) { String message = new String("General 'Funky' Error Detected"); log.fatal(message); fail(message); } if (!servletResponse.contains("The result key for this lesson is")) { String message = new String("Valid Solution did not yeild Result Key"); log.fatal(message); fail(message); } if (!servletResponse.contains(xssString)) { String message = new String("Xss String Not Reflected in Response"); log.fatal(message); fail(message); } } } catch (Exception e) { log.fatal("Could not Complete: " + e.toString()); fail("Could not Complete: " + e.toString()); } } @Test public void testLevelInvalidAnswer() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = "

NotXSSAtAll

"; String servletResponse = getModuleDoPost(xssString, csrfToken, 302); if (servletResponse.contains("You must be getting funky")) { String message = new String("General 'Funky' Error Detected"); log.fatal(message); fail(message); } if (servletResponse.contains("The result key for this lesson is")) { String message = new String("Invalid Solution Returnedd Result Key"); log.fatal(message); fail(message); } if (!servletResponse.contains(xssString)) { String message = new String("Xss String Not Reflected in Response"); log.fatal(message); fail(message); } } } catch (Exception e) { log.fatal("Could not Complete: " + e.toString()); fail("Could not Complete: " + e.toString()); } } @Test public void testLevelInvalidAnswerIncompleteScript() { String userName = "lessonTester"; try { // Verify User Exists in DB GetterIT.verifyTestUser(applicationRoot, userName, userName); // Sign in as Normal User log.debug("Signing in as " + userName + " Through LoginServlet"); TestProperties.loginDoPost(log, request, response, userName, userName, null, lang); log.debug("Login Servlet Complete, Getting CSRF Token"); if (response.getCookie("token") == null) { fail("No CSRF Token Was Returned from Login Servlet"); } String csrfToken = response.getCookie("token").getValue(); if (csrfToken.isEmpty()) { String message = new String("No CSRF token returned from Login Servlet"); log.fatal(message); fail(message); } else { request.setCookies(response.getCookies()); String xssString = "