본문 바로가기

Security Study/Web

[Dreamhack] Cross Site Request Forgery (CSRF)

ClientSide: CSRF

1. Cross Site Request Forgery (CSRF)

1.1. Cross Site Request Forgery (CSRF)

임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점

  • 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있음
  • 이용자의 계정으로 임의 금액을 송금해 금전적인 이득을 취하거나, 비밀번호를 변경해 계정을 탈취하고 관리자 계정을 공격해 공지사항 작성 등으로 혼란을 야기할 수 있음

이용자의 송금 요청

GET /sendmoney?to=dreamhack&amount=1337 HTTP/1.1
Host: bank.dreamhack.io
Cookie: session=IeheighaiToo4eenahw3

송금 기능

# 이용자가 /sendmoney에 접속했을때 아래와 같은 송금 기능을 웹 서비스가 실행함.
@app.route('/sendmoney')
def sendmoney(name):
    # 송금을 받는 사람과 금액을 입력받음.
    to_user = request.args.get('to')
	amount = int(request.args.get('amount'))
	
	# 송금 기능 실행 후, 결과 반환	
	success_status = send_money(to_user, amount)
	
	# 송금이 성공했을 때,
	if success_status:
	    # 성공 메시지 출력
		return "Send success."
	# 송금이 실패했을 때,
	else:
	    # 실패 메시지 출력
		return "Send fail."
  • CSRF 취약점이 존재하는 예제 코드로, 송금 기능을 수행
  • 이용자로부터 예금주와 금액을 입력받고 송금을 수행
  • 이때 계좌 비밀번호, OTP 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용할 수 있음

1.2. Cross Site Request Forgery 동작

  • CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 함
  • 공격자가 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있음
  • 악성 스크립트는 HTTP 요청을 보내는 코드
  • CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있음

CSRF 스크립트 예시

  • img 태그를 사용하거나 웹 페이지에 입력된 양식을 전송하는 form태그를 사용하는 방법이 있음
  • 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됨

HTML img 태그 공격 코드 예시

<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>
  • img태그는 이미지의 크기를 줄일 수 있는 옵션을 제공
  • 이를 활용하면 이용자에게 들키지 않고 임의 페이지에 요청을 보낼 수 있음

Javascript 공격 코드 예시

/* 새 창 띄우기 */
window.open('<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>');

/* 현재 창 주소 옮기기 */
location.href = '<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>';
location.replace('<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>');
  • 새로운 창을 띄우고, 현재 창의 주소를 옮기는 등의 행위가 가능

1.3. Cross Site Request Forgery 실습

Javascript 실행이 제한되어 있으므로, HTML 태그를 통해 계좌 잔고를 1,000,000 이상으로 늘리기

<img src="/sendmoney?to=dreamhack&amount=1337">
<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=1337');">
<link rel="stylesheet" href="/sendmoney?to=dreamhack&amount=1337">
...

1.4. XSS와 CSRF의 차이

XSS와 CSRF는 스크립트를 웹 페이지에 작성해 공격한다는 점에서 매우 유사

공통점

두 개의 취약점 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 함

차이점

  • XSS공격할 사이트의 오리진에서 스크립트를 실행시킴
  • 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격
  • CSRF공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있음
  • 이용자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 하는 공격
반응형

'Security Study > Web' 카테고리의 다른 글

[Dreamhack] Command Injection  (0) 2024.04.12
[Dreamhack] SQL Injection  (2) 2024.02.20
[Dreamhack] Cross-Site-Scripting (XSS)  (2) 2024.02.09
[Dreamhack] Cookie & Session  (2) 2024.02.07
[Dreamhack] Background - Web  (0) 2024.02.04