Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

kaki1013

[STAGE 5] Cross Site Request Forgery (CSRF) 본문

버그바운티 스터디/Web Hacking

[STAGE 5] Cross Site Request Forgery (CSRF)

kaki1013 2023. 8. 2. 18:27

# ClientSide: CSRF

0. 서론

일상에서 서명 : 서명자가 문서의 내용에 동의했다는 것을 함축 → 서명된 문서는 효력 가짐 & 이용자의 권한도 부여 받음

→ 이용자의 식별 정보가 포함된 쿠키 : 클라이언트에서 보내진 요청이 이용자로부터 왔으며, 이용자가 동의함

→ 따라서 요청에 이용자의 권한이 부여돼야함을 의미함

→ 실생활과 밀접한 웹 서비스가 많아졌으므로, 서명을 신중하게 관리하는 것 만큼 웹 서비스의 쿠키도 잘 보관해야 함

서명과 관련된 범죄는 서명을 날조하거나, 서명된 문서를 위조하는 것 등이 있음

→ 이러한 범죄는 웹 해킹의 공격 기법들과도 대응됨

전자 : 이전 강의에서 살펴본 쿠키를 탈취하는 공격

후자 : 이번 강의에서 배울 교차 사이트 요청 위조(Cross Site Request Forgery, CSRF)

서명된 문서를 위조하는 것 : 이미 서명된 문서의 내용을 조작하는 것

→ 빈 종이에 서명하지 말아야 하는 것이 이러한 위험을 피하기 위함

→ 나중에 누군가 그 종이에 "나는 A에게 전재산을 양도한다." 따위의 문장을 적어서 내용을 위조해도,

    서명으로 인해 효력을 가질 수 있기 때문

CSRF : 위와 비슷하게 이용자를 속여서, 의도치 않은 요청에 동의하게 하는 공격

→ 그럴듯한 웹 페이지를 만들어서 이용자의 입력을 유도

→ 이용자가 값을 입력하면 이를 은행이나 중요 포털 사이트 등으로 전송

→ 마치 이용자가 동의한 것 같은 요청을 발생시킴

→ 만약, 이용자가 "자동 로그인"등의 기능을 사용하여 브라우저에 세션 쿠키를 저장하고 있었다면,

    실제로 계좌 이체가 발생하거나 비밀번호 초기화가 이뤄질 수도 있음

1. Cross Site Request Forgery (CSRF)

웹 서비스 : 쿠키 또는 세션을 사용해 이용자를 식별

→ 임의 이용자의 쿠키를 사용할 수 있다면, 이는 곧 임의 이용자의 권한으로 웹 서비스의 기능을 사용 가능함을 의미

 

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

→ 공격자 : 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있음

 

예시 코드) 송금 기능을 수행

# 이용자가 /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 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용 가능


2. CSRF 동작
CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 함

→ 이는 공격자가 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있음

→ 여기서 말하는 악성 스크립트 = HTTP 요청을 보내는 코드

CSRF 공격 스크립트 : HTML 또는 Javascript를 통해 작성 가능

(1) HTML

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

<img src="https://test.dreamhack.io/main-long.png">

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

<form action="https://test.dreamhack.io/users/1" method="post">
	<input name="user">
	<input name="pass">
	<input type="submit">
</form>

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

 

예시 코드) 

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

 

img 태그는 이미지의 크기를 줄일 수 있는 옵션을 제공 이용자에게 들키지않고 임의 페이지에 요청을 보낼 수 있음

 

(2) 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');

 

3. CSRF 실습

<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">
<!-- http://www.tcpschool.com/html-tag-attrs/link-rel 참고 -->

 

4. XSS와 CSRF 차이

  XSS CSRF
공통점 1. 클라이언트를 대상으로 하는 공격

2. 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 함
차이점 목적 : 인증 정보인 세션 및 쿠키 탈취

공격할 사이트의 오리진에서 스크립트를 실행시킴
목적 : 이용자가 임의 페이지에 HTTP 요청을 보내는 것

공격자는 악성 스크립트가 포함된 페이지에 접근한
이용자의 권한으로
웹 서비스의 임의 기능을 실행할 수 있음