프롤로그
CSRF 개념은 뭐 웹개발할 때 내가 알고 있던 지식으로는 이 게시물이 정상적인 사람으로부터 폼을 받았는가 체크하는 것으로만 단지 알고 있었다.
네이버 뒤져봤을 때는 "특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)을 하게 만드는 공격이다.
즉 내가 알던 개념이 아니었고, 이 드림핵 을 통해서 개념을 잡아보겠다.
https://learn.dreamhack.io/172#
Cross Site Request Forgery (CSRF)
웹 서비스는 쿠키 또는 세션을 사용해 이용자를 식별하는데, 임의 이용자의 쿠키를 사용하여 이용자의 권한으로 HTTP 요청을 보내는 취약점이다. 이를 토대로 임의 이용자의 권한으로 비밀번호를 변경해 계정 탈취, 관리자 계정으로 공지사항 작성 등을 할 수 있다.
CSRF 동작
공격자가 작성한 악성스크립트를 이용자가 실행해야한다.
공격자가 작성한 웹 페이지(HTML/JS 사용)에 img 태그나 form 태그를 사용하여 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증정보가 포함되어 들어간다.
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."
문제 조건 : dreamhack&amount 로 보낼 것
코드를 보면, to 라는 매개변수를 얻고, 거기의 값의 총액을 받아들인다. 그리고 송금을 하는 send_money 함수가 보인다.
자바스크립트를 이용하는 것이 아닌, HTML 태그를 이용하라고 되어 있는데, 보통 img 나 form 을 이용한다고 되어있다.
저번 xss-2 에서 img src="x" onerror=~~~~를 이용했던 것을 이용한 예시는 아래와 같다.
<img src = "x" onerror ="fetch('/sendmoney?to=dreamhack&amount=1337');">
fetch
이때 fetch가 무엇인가?
fetch는 매개변수로 전달한 URL과 옵션객체를 통해 HTTP 통신을 수행하는 것이다.
fetch(url)
.then(response => response.json()) // 또는 response.text(), response.blob() 등
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
기본 구조는 위와 같다.
fetch(url, {
method: 'POST', // GET, POST, PUT, DELETE 등
headers: {
'Content-Type': 'application/json'
// 기타 헤더 설정
},
body: JSON.stringify(data) // 서버로 보낼 데이터
})
옵션은 위와 같이 매개변수를 하나를 더 넣는다. 옵션을 통해 HTTP 메소드, 헤더, 바디 등을 설정할 수 있다.
응답처리는 .then 을 이용한다.
이를 이용하여 코드를 작성하면
위와 같이 성공했다고 나온다.
그외에도
<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">
이 중에 하나를 작성하면 되는 것 같다.
XSS와 CSRF의 차이
웹 페이지에 작성해 공격한다는 점에서 유사하다
공통점 : 클라이언트를 대상으로 공격하는데, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도
차이점 : XSS는 인증 정보인 세션 및 쿠키 탈취 목적, 공격할 사이트의 오리진에서 스크립트 실행
CSRF는 이용자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 하는 공격.
에필로그
그니까 해커가 만든 페이지에 이용자가 막 접속만 해도(GET요청) 거기에 헤더들을 넣어서 실제 원래 페이지에 전송을 하여 정보 탈취한다는 뜻인가?
일단 사용자가 신뢰하는 사이트에 로그인한 상태에서 악성 웹 사이트에 방문할 때 발생된다...
이 때 악성스크립트를 실행시켜 송금 요청을 보낼 수 있다... ..흠..
잘 이해는 안 가는데 일단 코드만이라도 외워간다.
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] CSRF-2 (웹해킹) (1) | 2024.01.07 |
---|---|
[드림핵/워게임] CSRF-1 (웹해킹) (1) | 2024.01.07 |
[드림핵/워게임] xss-2 (웹 해킹) (1) | 2024.01.05 |
[드림핵/웹해킹] Mitigation : Same Origin Policy (0) | 2024.01.04 |
[드림핵/워게임] session-basic (웹해킹) (1) | 2024.01.03 |