1 분 소요

쿠키나 웹 스토리지를 사용할 때 스크립트로 접근이 가능하기 때문에 XSS에 취약하다고 했었다.

1. XSS(Cross-Site Scripting)

XSS는 가장 널리 알려진 웹 보안 취약점 중 하나로, 악의적인 사용자가 공격하려는 사이트에 악성 스크립트를 삽입할 수 있는 것을 말한다. 게시판에서, 에디터에 사용자가 작성한 내용을 화면에 보여준다. 만약 아무런 보안장치가 없는 게시판 사이트에 악의적인 사용자가 에디터에 스크립트 태그를 작성한다고 치자.

<script>alert("attack!!")</script>

그럼, 이런 식으로 내용에 들어가게 될텐데 브라우저는 이걸 게시물의 내용이 아니라 태그로 인식하게 된다.

<header>
...
</header>
<body>
  ...
  <!--게시판 내용 부분 -->
  <section>
    <script>
      alert("attack!!")
    </script>
  </section>
  ...
</body>

만약 일반 사용자가 이 게시물을 열람하게 되면, 열람자의 로그인 정보가 그대로 해커에게 넘어가게 된다. 스크립트 태그뿐만 아니라 이미지, 링크 태그 등 다양한 방식으로 시도된다. 이를 막기 위해 프론트에서도 차단해야 하고, 서버에서도 DB에 저장되지 않도록 막아야 한다. DOMPurify와 같은 whitelist xss library를 사용해야 한다. 또한, 사용자 정보가 담긴 쿠키는 HTTP-only 속성을 걸어서 자바스크립트로 접근하지 못하게 해야 한다.




2. CSRF(Cross Site Request Forgery)

CSRF란, 사이트 간 요청을 위조하는 것이다. 해커들이 피싱을 활용해 링크를 누르도록 유도하고, 링크를 클릭하면 사용자 모르게 기능을 실행하도록 만든 것이다. 주로 비밀번호를 변경하는 기능이다. 순서는 다음과 같다.

  1. 사용자가 정상적으로 접속해서 로그인을 한다.

  2. 사용자가 사이트에 로그인 되어 있는 동안, 해커는 어떤 링크를 클릭하도록 피싱한다.

  3. 클릭하게 되면, 이미 로그인 되어 있던 사이트에 비밀번호 변경 요청이 자동으로 전송된다.

  4. 유저가 모르는 사이 웹사이트의 비밀번호가 변경된다.

이 다음부터 해커는 변경된 비밀번호를 사용하여 사용자의 계정으로 로그인 할 수 있게 된다. 로그인을 한 상태로 여러 탭을 열어 사용하는 경우가 많기 때문에 이러한 공격에 노출되어 있다.




3. SQL-Injection

서버에서 요청을 보낸 사용자가 (관리자, 회원 등의) 권한이 있는지 sql문으로 검증한다. 예를 들면, 다음과 같이 검증을 한다고 치자.

if (email === a@a.com && pw === 1234) { 대충 액세스토큰을 프론트에 보내주라는 내용... }

그런데 이때 a@a.com라는 이메일과 함께 비밀번호로 qqq || 1 === 1과 같은 비밀번호가 입력되면, pw가 true가 되면서 로그인이 뚫린다. 따라서 sql인자로 들어가는 모든 값들을 철저히 검증해야 한다. 사용자가 인자 값을 절대 직접 작성할 수 없도록, 프론트에서 검증하고 서버에서 또 검증해서 sql문에 넣어야 한다.

이 세 가지 말고도 매우 많다. OWASP에서는 웹에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하고, 3-4년마다 10대 웹 애플리케이션 취약점(OWASP TOP 10)을 발표하니까 보는 것이 좋다!! OWASP(The Open Web Application Security Project)

댓글남기기