1.XSS (Cross Site Scripting)
XSS는 Cross Site Scripting의 약자로 웹페이지 어딘가에 악성 자바스크립트를 삽입하여 사용자의 정보를 가로채거나, 사이트의 정상적인 이용을 방해하는 공격이다. 원리는 매우 간단하지만, 한번 성공했을 때의 파급력은 경우에 따라 웹페이지 전체를 장악할 수 있을 정도로 강력하다. 방식에 따라 stored와 reflected로 나뉘어진다.
1. stored xss
위 그림처럼 어떤 사용자가 정상적인 게시물에 <script>alert(1)</script> 라고 댓글을 달았다고 하자.
이 댓글이 달린 이후에 게시물을 조회할 경우 자연스럽게 댓글도 같이 불러와 화면에 출력해줄 것이다.
브라우저가 <script>alert(1)</script> 라는 댓글을 만나면 당연히 이를 자바스크립트 코드로 해석하여 화면에 경고창을 띄워주게 될 것이다. 여기선 단순히 경고창을 띄우는 것이라 별 문제는 없겠지만, 만일 이것이 쿠키에 저장된 세션아이디를 어떤 서버로 전송하는 코드라면 당연히 사용자는 무슨일이 일어났는지도 모르게 로그인정보가 탈취되는 것이다.
이런 과정에서 악성스크립트가 서버에 저장되므로 stored xss라고 부른다.
2. reflected xss
웹사이트를 이용하다보면 사용자의 입력을 그대로 포함하여 출력해주는 기능을 제공하는 경우가 있다.
바로 검색기능이다. 보통, 이런 기능은 어떤 데이터를 조회하는 기능이므로 get 메소드를 이용하여 서버와 통신한다. 즉, URL에 사용자의 입력을 파라미터로 지정하여 전송하는 것이다. 이 때, URL에 자바스크립트 코드를 파라미터로 지정한다면, 응답에는 자바스크립트코드가 포함될 것이고, 해당 코드가 브라우저에 의해 실행될 수 있다.
이걸 악용하기 위해 공격자는 악의적인 스크립트가 포함된 URL을 타겟에게 항상 사용하던 웹사이트측에서 보낸 것 처럼 위장해서 이메일등으로 보낸다. 타겟은 보통 일반적인 유저이므로, URL에 적힌 파라미터가 무었을 의미하는지 모르고, 단지, 도메인만 같으면 신뢰하고 클릭할 것이다. 그렇게 되면 사용자의 정보가 공격자에게 넘어가게 되는 것이다.
이런 과정에서 서버에 악성스크립트가 저장되지 않고 그대로 사용자에게 돌아오는 특성때문에 reflected xss 라고 한다.
3. 보안방법 (개발자의 관점에서)
가장 기본적인 방법이자 유일한 방법은 모든 사용자의 입력이 가능한 곳에서 사용자의 입력을 검사하고, 이를 출력할 때에도 출력해도 되는 것인지 검사하는 방법 뿐이다.
html 서식을 지원하지 않는 곳에서는 비교적 간단하게 막을 수 있다. '<', '>' 등의 html 혹은 자바스크립트의 문법으로 작동할 수 있는 문자들은 html escape 문자로 대체하여 브라우저가 자바스크립트라고 인지하지 않도록 하면 된다.
개발자 입장에서 골치아픈 경우는 티스토리처럼 게시글에 html 서식을 지원하는 경우이다. 이 경우 모든 '<', '>' 등의 문자를 escape 문자로 바꾸면 서식을 사용할 수 없기 때문에, 특정 태그및 속성을 필터링해야 한다.
문제는, 막아야할 태그와 속성이 한두가지가 아니고, 언제나 공격자는 개발자가 생각하지 못한 기괴한 태그와 속성을 이용해 공격을 시도하기 때문에 하나하나 막는것은 좋은 방법이 아니다.
따라서 보통의 경우 블랙리스트 기반의 필터링이 아닌 화이트리스트 기반의 필터링을 채택한다.
말 그대로 위험하지 않다고 자명하게 알려진 태그와 속성만 게시글에 포함 될 수 있게 하는 것이다.
'Security' 카테고리의 다른 글
[Auth] 세션과 토큰 (0) | 2021.11.15 |
---|---|
업데이트 배포서버가 해킹된다면? - 2편 (0) | 2021.01.11 |
업데이트 배포서버가 해킹된다면? - 1편 (0) | 2021.01.05 |
CSRF 실습 (0) | 2020.09.23 |