initial test cases added
This commit is contained in:
parent
8d7142e6d3
commit
e932253f06
@ -0,0 +1,153 @@
|
|||||||
|
package org.owasp.webgoat;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import io.restassured.RestAssured;
|
||||||
|
import io.restassured.http.ContentType;
|
||||||
|
|
||||||
|
public class CSRFTest extends IntegrationTest {
|
||||||
|
|
||||||
|
private static final String trickHTML3 = "<!DOCTYPE html><html><body><form action=\"WEBGOATURL\" method=\"POST\">\n" +
|
||||||
|
"<input type=\"hidden\" name=\"csrf\" value=\"thisisnotchecked\"/>\n" +
|
||||||
|
"<input type=\"submit\" name=\"submit\" value=\"assignment 3\"/>\n" +
|
||||||
|
"</form></body></html>";
|
||||||
|
|
||||||
|
private static final String trickHTML4 = "<!DOCTYPE html><html><body><form action=\"WEBGOATURL\" method=\"POST\">\n" +
|
||||||
|
"<input type=\"hidden\" name=\"reviewText\" value=\"hoi\"/>\n" +
|
||||||
|
"<input type=\"hidden\" name=\"starts\" value=\"3\"/>\n" +
|
||||||
|
"<input type=\"hidden\" name=\"validateReq\" value=\"2aa14227b9a13d0bede0388a7fba9aa9\"/>\n" +
|
||||||
|
"<input type=\"submit\" name=\"submit\" value=\"assignment 4\"/>\n" +
|
||||||
|
"</form>\n" +
|
||||||
|
"</body></html>";
|
||||||
|
|
||||||
|
private static final String trickHTML7 = "<!DOCTYPE html><html><body><form action=\"WEBGOATURL\" enctype='text/plain' method=\"POST\">\n" +
|
||||||
|
"<input type=\"hidden\" name='{\"name\":\"WebGoat\",\"email\":\"webgoat@webgoat.org\",\"content\":\"WebGoat is the best!!' value='\"}' />\n" +
|
||||||
|
"<input type=\"submit\" value=\"assignment 7\"/>\n" +
|
||||||
|
"</form></body></html>";
|
||||||
|
|
||||||
|
private String webwolfFileDir;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void runTests() throws IOException {
|
||||||
|
startLesson("CSRF");
|
||||||
|
|
||||||
|
webwolfFileDir = getWebWolfServerPath();
|
||||||
|
|
||||||
|
//Assignment 3
|
||||||
|
uploadTrickHtml("csrf3.html", trickHTML3.replace("WEBGOATURL", url("/csrf/basic-get-flag")));
|
||||||
|
checkAssignment3(callTrickHtml("csrf3.html"));
|
||||||
|
|
||||||
|
uploadTrickHtml("csrf4.html", trickHTML4.replace("WEBGOATURL", url("/csrf/review")));
|
||||||
|
checkAssignment4(callTrickHtml("csrf4.html"));
|
||||||
|
|
||||||
|
uploadTrickHtml("csrf7.html", trickHTML7.replace("WEBGOATURL", url("/csrf/feedback/message")));
|
||||||
|
//checkAssignment7(callTrickHtml("csrf7.html"));
|
||||||
|
|
||||||
|
//checkResults("/csrf");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void uploadTrickHtml(String htmlName, String htmlContent) throws IOException {
|
||||||
|
|
||||||
|
//remove any left over html
|
||||||
|
Path webWolfFilePath = Paths.get(webwolfFileDir);
|
||||||
|
if (webWolfFilePath.resolve(Paths.get(getWebgoatUser(),htmlName)).toFile().exists()) {
|
||||||
|
Files.delete(webWolfFilePath.resolve(Paths.get(getWebgoatUser(),htmlName)));
|
||||||
|
}
|
||||||
|
|
||||||
|
//upload trick html
|
||||||
|
RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("WEBWOLFSESSION", getWebWolfCookie())
|
||||||
|
.multiPart("file", htmlName, htmlContent.getBytes())
|
||||||
|
.post(webWolfUrl("/WebWolf/fileupload"))
|
||||||
|
.then()
|
||||||
|
.extract().response().getBody().asString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String callTrickHtml(String htmlName) {
|
||||||
|
String result = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.cookie("WEBWOLFSESSION", getWebWolfCookie())
|
||||||
|
.get(webWolfUrl("/files/"+getWebgoatUser()+"/"+htmlName))
|
||||||
|
.then()
|
||||||
|
.extract().response().getBody().asString();
|
||||||
|
result = result.substring(8+result.indexOf("action=\""));
|
||||||
|
result = result.substring(0, result.indexOf("\""));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAssignment3(String goatURL) {
|
||||||
|
|
||||||
|
String flag = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.header("Referer", webWolfUrl("/files/fake.html"))
|
||||||
|
.post(goatURL)
|
||||||
|
.then()
|
||||||
|
.extract().path("flag").toString();
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.clear();
|
||||||
|
params.put("confirmFlagVal", flag);
|
||||||
|
checkAssignment(url("/WebGoat/csrf/confirm-flag-1"), params, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAssignment4(String goatURL) {
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.clear();
|
||||||
|
params.put("reviewText", "test review");
|
||||||
|
params.put("stars", "5");
|
||||||
|
params.put("validateReq", "2aa14227b9a13d0bede0388a7fba9aa9");//always the same token is the weakness
|
||||||
|
|
||||||
|
boolean result = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.header("Referer", webWolfUrl("/files/fake.html"))
|
||||||
|
.formParams(params)
|
||||||
|
.post(goatURL)
|
||||||
|
.then()
|
||||||
|
.extract().path("lessonCompleted");
|
||||||
|
assertEquals(true, result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAssignment7(String goatURL) {
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.clear();
|
||||||
|
params.put("{\"name\":\"WebGoat\",\"email\":\"webgoat@webgoat.org\",\"content\":\"WebGoat is the best!!", "\"}");
|
||||||
|
|
||||||
|
String result = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.header("Referer", webWolfUrl("/files/fake.html"))
|
||||||
|
.formParams(params)
|
||||||
|
.log().all()
|
||||||
|
.contentType(ContentType.TEXT)
|
||||||
|
.post(goatURL)
|
||||||
|
.then()
|
||||||
|
.log().all()
|
||||||
|
.extract().asString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -252,5 +252,33 @@ public abstract class IntegrationTest {
|
|||||||
.extract().path("lessonCompleted"), CoreMatchers.is(expectedResult));
|
.extract().path("lessonCompleted"), CoreMatchers.is(expectedResult));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getWebGoatServerPath() throws IOException {
|
||||||
|
|
||||||
|
//read path from server
|
||||||
|
String result = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("JSESSIONID", getWebGoatCookie())
|
||||||
|
.get(url("/WebGoat/xxe/tmpdir"))
|
||||||
|
.then()
|
||||||
|
.extract().response().getBody().asString();
|
||||||
|
result = result.replace("%20", " ");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWebWolfServerPath() throws IOException {
|
||||||
|
|
||||||
|
//read path from server
|
||||||
|
String result = RestAssured.given()
|
||||||
|
.when()
|
||||||
|
.relaxedHTTPSValidation()
|
||||||
|
.cookie("WEBWOLFSESSION", getWebWolfCookie())
|
||||||
|
.get(webWolfUrl("/tmpdir"))
|
||||||
|
.then()
|
||||||
|
.extract().response().getBody().asString();
|
||||||
|
result = result.replace("%20", " ");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,32 +82,4 @@ public class XXETest extends IntegrationTest {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getWebGoatServerPath() throws IOException {
|
|
||||||
|
|
||||||
//read path from server
|
|
||||||
String result = RestAssured.given()
|
|
||||||
.when()
|
|
||||||
.relaxedHTTPSValidation()
|
|
||||||
.cookie("JSESSIONID", getWebGoatCookie())
|
|
||||||
.get(url("/WebGoat/xxe/tmpdir"))
|
|
||||||
.then()
|
|
||||||
.extract().response().getBody().asString();
|
|
||||||
result = result.replace("%20", " ");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getWebWolfServerPath() throws IOException {
|
|
||||||
|
|
||||||
//read path from server
|
|
||||||
String result = RestAssured.given()
|
|
||||||
.when()
|
|
||||||
.relaxedHTTPSValidation()
|
|
||||||
.cookie("WEBWOLFSESSION", getWebWolfCookie())
|
|
||||||
.get(webWolfUrl("/tmpdir"))
|
|
||||||
.then()
|
|
||||||
.extract().response().getBody().asString();
|
|
||||||
result = result.replace("%20", " ");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@ -40,7 +41,7 @@ import java.util.Random;
|
|||||||
/**
|
/**
|
||||||
* Created by jason on 9/30/17.
|
* Created by jason on 9/30/17.
|
||||||
*/
|
*/
|
||||||
|
@RestController
|
||||||
public class CSRFGetFlag {
|
public class CSRFGetFlag {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -48,7 +49,7 @@ public class CSRFGetFlag {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PluginMessages pluginMessages;
|
private PluginMessages pluginMessages;
|
||||||
|
|
||||||
@RequestMapping(produces = {"application/json"}, method = RequestMethod.POST)
|
@RequestMapping(path="/csrf/basic-get-flag" ,produces = {"application/json"}, method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Map<String, Object> invoke(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
public Map<String, Object> invoke(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@
|
|||||||
padding: 7px;
|
padding: 7px;
|
||||||
margin-top:7px;
|
margin-top:7px;
|
||||||
padding:5px;">
|
padding:5px;">
|
||||||
<div class="attack-container">
|
<div class="example-container">
|
||||||
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
<div class="assignment-success"><i class="fa fa-2 fa-check hidden" aria-hidden="true"></i></div>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user