2015년 12월 1일 화요일

입력데이터 검증 및 표현 - 크로스사이트 요청 위조 (CSRF)

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.  }  

댓글 없음:

댓글 쓰기