Oh! JUN
[WebGoat] Cross Site Request Forgeries - 2 본문
[WebGoat] Cross Site Request Forgeries - 2
Kwon Oh! JUN 2023. 12. 23. 15:361. 문제설명
다른 사람을 대신하여 리뷰 게시
아래 페이지는 댓글/리뷰 페이지를 시뮬레이션합니다. 여기서 차이점은 CSRF 공격과 마찬가지로 이전 연습과 마찬가지로 다른 곳에서 제출을 시작해야 한다는 것입니다. 생각보다 쉽습니다. 대부분의 경우 더 까다로운 부분은 CSRF 공격을 실행하려는 위치를 찾는 것입니다. 전형적인 예는 누군가의 은행 계좌로의 계좌/전신 송금입니다.
하지만 여기서는 간단하게 설명하겠습니다. 이 경우 현재 로그인한 사용자를 대신하여 리뷰 제출을 실행하기만 하면 됩니다.
2. 문제풀이
이전 문제와 해결방법은 거의 똑같습니다.
하지만 stars의 값의 데이터형과 validataReq값을 올바르게 설정해줘야 문제를 해결할 수 있습니다.
이전 문제와 동일하게 코드를 생성하고 댓글을 달면 문제를 해결할 수 있습니다.
자세한 설명은 코드분석을 통해 알아보겠습니다.
3. 코드분석
@PostMapping("/csrf/review")
@ResponseBody
public AttackResult createNewReview(String reviewText, Integer stars, String validateReq, HttpServletRequest request) {
final String host = (request.getHeader("host") == null) ? "NULL" : request.getHeader("host");
final String referer = (request.getHeader("referer") == null) ? "NULL" : request.getHeader("referer");
final String[] refererArr = referer.split("/");
Review review = new Review();
review.setText(reviewText);
review.setDateTime(DateTime.now().toString(fmt));
review.setUser(webSession.getUserName());
review.setStars(stars);
var reviews = userReviews.getOrDefault(webSession.getUserName(), new ArrayList<>());
reviews.add(review);
userReviews.put(webSession.getUserName(), reviews);
//short-circuit
if (validateReq == null || !validateReq.equals(weakAntiCSRF)) {//validateReq가 weakAntiCSRF = "2aa14227b9a13d0bede0388a7fba9aa9" 이지 않거나 validateReq가 null이면 실패하게 됩니다.
return failed(this).feedback("csrf-you-forgot-something").build();
}
//we have the spoofed files
if (referer != "NULL" && refererArr[2].equals(host)) {//referer이 null이 아니고 refererArr[2]이 host와 동일하면 원래의 호스트에서 요청했다고 판단하고 실패하게 됩니다.
return failed(this).feedback("csrf-same-host").build();
} else {
return success(this).feedback("csrf-review.success").build(); //feedback("xss-stored-comment-failure")
}
}
validateReq와 referer변수를 다루고 있는 조건문을 살펴보면 되는데
첫번째로 validateReq변수는 validateReq가 weakAntiCSRF = "2aa14227b9a13d0bede0388a7fba9aa9" 이지 않거나 validateReq가 null이면 실패하게 됩니다.
두번쨰로 referer변수는 referer이 null이 아니고 refererArr[2]이 host와 동일하면 원래의 호스트에서 요청했다고 판단하고 실패하게 됩니다.
그래서 validateReq는 "2aa14227b9a13d0bede0388a7fba9aa9" 맞춰줘야하고
referer는 null이어야 문제가 해결됩니다.
* referer에 대한 자세한 설명은 아래의 이전문제에서 참고하시기 바랍니다.
'웹 해킹 > Request Forgeries(CSRF)' 카테고리의 다른 글
[개인 공부] JSESSIONID와 CSRF 토큰 (0) | 2024.01.17 |
---|---|
[WebGoat] Cross Site Request Forgeries - 3 (0) | 2023.12.23 |
[WebGoat] Cross-Site Request Forgeries - 1 (0) | 2023.12.23 |