[dreamhack] ClientSide : CSRF

skaekdms·2023년 2월 18일
0

web hacking

목록 보기
9/12

📌 CSRF

CSRF(Cross Site Request Forgery)는 임의 이용자의 권한으로 임의 주소에 HTTP요청을 보낼 수 있는 취약점이다. 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있다.

다음은 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."

코드를 보면, 이용자로부터 예금주(to_user)와 금액(amount)을 입력받고 송금을 수행하는 걸 확인할 수 있다.
계좌 비밀번호, OTP 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 사용할 수 있다.

📌 CSRF 동작

CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 한다.
악성 스크립트는 HTTP 요청을 보내는 코드이다.

CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있다.
위 사진은 HTML을 사용한 스크립트이다.
img 태그를 사용하거나 form 태그를 사용하는 방법이 있다.
두 개의 태그를 이용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함된다.

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

다음은 img 태그를 이용한 스크립트의 예시이다.

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

다음은 Javascript 스크립트 예시이다.
window.open으로 새 창을 띄우거나, location.replace를 사용해서 현재 창의 주소를 옮기는 등의 행위가 가능하다.


Forgery 실습

<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=1000000');">

✏️ XSS와 CSRF의 차이

공통점

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

차이점

  • XSS는 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격
  • CSRF는 이용자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 하는 공격
  • XSS는 공격할 사이트의 오리진(Origin)에서 스크립트를 실행시킴
  • CSRF는 공격자가 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있다.
profile
차곡차곡 쌓아나가는 WEB FE 개발자

0개의 댓글