1)
크로스사이트 요청 위조
특정 웹사이트에 대해서 사용자가 인지하지 못한 상황에서 사용자의
의도와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)을 요청하게 하는 공격을 말한다. 웹 어플리케이션이 사용자로부터 받은 요청에 대해서 사용자가 의도한 대로 작성되고 전송된 것인지 확인하지 않는
경우 발생 가능하고 특히 해당 사용자가 관리자인 경우 사용자 권한관리, 게시물삭제, 사용자 등록 등 관리자 권한으로만 수행 가능한 기능을 공격자의 의도대로 실행시킬 수 있게 된다.
공격자는 사용자가 인증한 세션이 특정 동작을 수행하여도 계속
유지되어 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용하여 피해가 발생한다. 웹 응용프로그램에
요청을 전달할 경우, 해당 요청의 적법성을 입증하기 위하여 전달되는 값이 고정되어 있고, 이러한 자료가 GET 방식으로 전달된다면 공격자가 이를 쉽게 알아내어
원하는 요청을 보냄으로써 위험한 작업을 요청할 수 있게 된다.
n 안전한 코딩
기법
① 입력화면
폼 작성 시 GET 방식보다는 POST 방식을 사용하고, 입력화면 폼과 해당 입력을 처리하는 프로그램 사이에 토큰을 사용하여, 공격자의
직접적인 URL 사용이 동작하지 않도록 처리한다. 특히 중요한
기능에 대해서는 사용자 세션검증과 더불어 재 인증을 유도한다.
1. // CSRF 방지를 위한 state token 생성 코드
2. // state
token은 추후 검증을 위해 세션에 저장 되어야 한다.
3.
4. public String generateState(){
5. SecureRandom random = new SecureRandom();
6. return new BigInteger(130, random).toString(32);
7. }
8.
9. // state
token으로 사용할 랜덤 문자열 생성
10. String state = generateState();
11. // 세션 또는 별도의 스토리지에 state token을 저장
12. HttpSession session = request.getSession();
13. session.setAttribute("state", state);
1. // CSRF 방지를 위한 state token 검증 코드
2. // 세션에 저장된 state token과 전달받은 state 값이 일치하여야 한다
3.
4. // callback
request에서 state파라미터의 값을 가져옴
5. String state = request.getParameter("state");
6.
7. // 세션 또는 별도의 스토리지에서 state token을 가져옴
8. HttpSession session = request.getSession();
9. String storedState = session.getAttribute("state", state);
10.
11. if( !state.equals( storedState ) ) {
12. return RESPONSE_UNAUTHORIZED; //401 unauthorized
13. } else {
14. Return RESPONSE_SUCCESS; //200 success
15. }
댓글 없음:
댓글 쓰기