본문 바로가기

Wargame/Dreamhack_Web

[드림핵 웹 해킹] STAGE 5 : CSRF(Cross Site Request Forgery) 크로스 사이트 요청 위조

  1. CSRF란?

쿠키는 요청에 포함되어 이 요청의 출처가 이용자이며 요청에 이용자의 권한이 부여돼야 함을 의미한다. 문서상의 계약에서 사용되는 서명을 이용한 범죄에는 서명을 날조하거나 서명된 문서를 위조하는 것이 있다. 웹 해킹에서의 쿠키도 쿠키를 날조하거나 쿠키가 있는 사이트를 위조하는 방법이 있다.

후자가 CSRF이다.

웹페이지를 만들어서 이용자의 입력을 유도하고, 이용자가 값을 입력하면 이를 은행이나 중요 포털 사이트 등으로 전송하여 이용자가 동의한 것처럼 보이게 할 수 있다.

자동로그인과 같은 기능은 브라우저에 세션과 쿠키를 저장하게 하는데, 이는 사용자도 모르는 계좌 이체나 비밀번호 초기화를 일으킬 수 있다.

  1. CSRF
  1. CSRF

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

Figure 1. 이용자의 송금 요청


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

**Figure 2. 송금 기능 :**이용자로부터 예금주와 금액을 입력받고 송금을 수행


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

이때 계좌 비밀번호, OTP 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용할 수 있다.

sendmoney함수→ to=dreamhack, amount=1337

<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">

src, onerror, link rel의 의미가 궁금하다

  1. CSRF 동작

CSRF는 공격자가 작성한 악성 스크립트(http요청을 보내는 코드)를 이용자가 실행해야한다. 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있다.

 

악성 스크립트 쓰는 방법

CSRF 공격 스크립트는 HTML또는 Javascript를 통해 작성한다.

(1)이미지를 불러오는 img 태그를 사용

(2) 웹 페이지에 입력된 양식을 전송하는 form 태그를 사용

 

 

 

 

이 두 개의 태그를 사용해 HTTP요청을 보내면 HTTP헤더인 Cookie에 이용자의 인증 정보가 포함된다

Figure 3. HTML img 태그 공격 코드 예시: 이미지의 크기를 줄일 수 있는 옵션을 제공


![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f31d8be0-3292-4c28-be0e-f3f287f29e3c/Untitled.png)

Figure 4. 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. XSS와 CSRF 차이

xss와 csrf 모두 클라이언트를 대상으로 하는 공격이고 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야한다.

xss는 인증 정보인 세션 및 쿠키 탈취가 목적이며, 공격할 사이트의 오리진에서 스크립트를 실행시킨다

(싸인을 뺏고 내 펜으로 새로 적기)

csrf는 이용자가 임의 페이지에 http요청을 보내는 것이 목적이며, 공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있다.

(싸인 있는 문서를 뺏어서 그쪽 펜으로 새로 적기) 이거 맞아?

  1. CSRF란?

쿠키는 요청에 포함되어 이 요청의 출처가 이용자이며 요청에 이용자의 권한이 부여돼야 함을 의미한다. 문서상의 계약에서 사용되는 서명을 이용한 범죄에는 서명을 날조하거나 서명된 문서를 위조하는 것이 있다. 웹 해킹에서의 쿠키도 쿠키를 날조하거나 쿠키가 있는 사이트를 위조하는 방법이 있다.

후자가 CSRF이다.

웹페이지를 만들어서 이용자의 입력을 유도하고, 이용자가 값을 입력하면 이를 은행이나 중요 포털 사이트 등으로 전송하여 이용자가 동의한 것처럼 보이게 할 수 있다.

자동로그인과 같은 기능은 브라우저에 세션과 쿠키를 저장하게 하는데, 이는 사용자도 모르는 계좌 이체나 비밀번호 초기화를 일으킬 수 있다.

  1. CSRF
  1. CSRF

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

Figure 1. 이용자의 송금 요청


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

**Figure 2. 송금 기능 :**이용자로부터 예금주와 금액을 입력받고 송금을 수행


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

이때 계좌 비밀번호, OTP 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용할 수 있다.

sendmoney함수→ to=dreamhack, amount=1337

<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">

src, onerror, link rel의 의미가 궁금하다

  1. CSRF 동작

CSRF는 공격자가 작성한 악성 스크립트(http요청을 보내는 코드)를 이용자가 실행해야한다. 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있다.

악성 스크립트 쓰는 방법

CSRF 공격 스크립트는 HTML또는 Javascript를 통해 작성한다.

(1)이미지를 불러오는 img 태그를 사용

(2) 웹 페이지에 입력된 양식을 전송하는 form 태그를 사용

이 두 개의 태그를 사용해 HTTP요청을 보내면 HTTP헤더인 Cookie에 이용자의 인증 정보가 포함된다

Figure 3. HTML img 태그 공격 코드 예시: 이미지의 크기를 줄일 수 있는 옵션을 제공




Figure 4. 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. XSS와 CSRF 차이

xss와 csrf 모두 클라이언트를 대상으로 하는 공격이고 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야한다.

xss는 인증 정보인 세션 및 쿠키 탈취가 목적이며, 공격할 사이트의 오리진에서 스크립트를 실행시킨다

(싸인을 뺏고 내 펜으로 새로 적기)

csrf는 이용자가 임의 페이지에 http요청을 보내는 것이 목적이며, 공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있다.

(싸인 있는 문서를 뺏어서 그쪽 펜으로 새로 적기) 이거 맞아?