XSS, CSRF, SQL-Injection
쿠키나 웹 스토리지를 사용할 때 스크립트로 접근이 가능하기 때문에 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란, 사이트 간 요청을 위조하는 것이다. 해커들이 피싱을 활용해 링크를 누르도록 유도하고, 링크를 클릭하면 사용자 모르게 기능을 실행하도록 만든 것이다. 주로 비밀번호를 변경하는 기능이다. 순서는 다음과 같다.
-
사용자가 정상적으로 접속해서 로그인을 한다.
-
사용자가 사이트에 로그인 되어 있는 동안, 해커는 어떤 링크를 클릭하도록 피싱한다.
-
클릭하게 되면, 이미 로그인 되어 있던 사이트에 비밀번호 변경 요청이 자동으로 전송된다.
-
유저가 모르는 사이 웹사이트의 비밀번호가 변경된다.
이 다음부터 해커는 변경된 비밀번호를 사용하여 사용자의 계정으로 로그인 할 수 있게 된다. 로그인을 한 상태로 여러 탭을 열어 사용하는 경우가 많기 때문에 이러한 공격에 노출되어 있다.
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)
댓글남기기