Oh! JUN

[WebGoat] Cross Site Request Forgeries - 2 본문

웹 해킹/Request Forgeries(CSRF)

[WebGoat] Cross Site Request Forgeries - 2

Kwon Oh! JUN 2023. 12. 23. 15:36

1. 문제설명


다른 사람을 대신하여 리뷰 게시

아래 페이지는 댓글/리뷰 페이지를 시뮬레이션합니다. 여기서 차이점은 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에 대한 자세한 설명은 아래의 이전문제에서 참고하시기 바랍니다.

 

[WebGoat] Cross-Site Request Forgeries - 1

1. 문제설명 기본 CSRF 가져오기 연습 로그인한 동안 외부 소스에서 아래 양식을 트리거합니다. 응답에는 '플래그'(숫자 값)가 포함됩니다. 플래그 확인 아래 이전 페이지에서 획득했어야 하는 플

securitystudy.tistory.com