XSS는 클라이언트 측에서 악성 스크립트를 실행시키는 공격입니다
이런 XSS의 대응 방안에는 무엇이 있을까요?
혹시 필터링을 떠올리지는 않으셨나요?
정말 필터링이 XSS의 대응 방안이 될 수 있는지 알아보도록 하겠습니다
🔎 필터링
: 특정 조건에 따라 데이터, 정보, 자료 등을 걸러내는 과정
필터링에는 화이트리스트 기반 필터링과 블랙리스트 기반 필터링이 있습니다
- 화이트리스트 기반 필터링 : 특정 단어만 허용
- 블랙리스트 기반 필터링 : 특정 단어만 제한
화이트리스트 기반 필터링은 특정 단어만 허용하기 때문에, 게시판 같은 공간에는 현실적으로 적용하기 어렵습니다
그럼 블랙리스트 기반 필터링은 어떨까요?
script 와 같은 태그나 < , > , ' , " 와 같은 특수문자가 문제가 된다면 이걸 제한하는 것으로 XSS 취약점을 해결할 수 있을까요?
정답은 아니요 입니다
우선 게시판의 상황을 가정하면 그저 script 라는 단어를 쓰고 싶었을 뿐인데 단어가 필터링 되어 사라진다거나, >.< 와 같은 표현을 하고 싶어도 할 수 없는 상황이 발생합니다
이런 상황을 감안하고 필터링을 통해 <script> ~~ </script> 를 삽입할 수 없게 만든다 하더라도, XSS 취약점을 해결할 수는 없습니다
왜냐하면 블랙리스트 기반 필터링은 언제나 우회 가능성을 가지고 있기 때문입니다
<script> 필터링 우회로 스크립트 실행시키기1. 대소문자 섞기
script 가 필터링 되어 있다면 대소문자를 섞어봅니다 (ex. <sCrIpT>)
2. 필터링 결과 값이 원하는 단어가 되도록 작성
script 가 필터링 되어 있다면 script 를 필터링 한 결과가 script가 되도록 작성합니다 (ex. scrscriptipt)
3. <script> 없이 다른 방식으로 스크립트 실행
만약 script 를 xript 와 같이 치환해버리는 방식의 필터링이 적용되어 있다면 script 라는 단어를 사용하지 않고 스크립트를 실행시킬 방법을 생각해 보아야 합니다
Event Handler 활용 : onerror , onclick , onmouseover 와 같이 스크립트가 실행되는 event handler 활용
ex) <img src = "x" onerror = "alert(1);"/> 와 같이 src 에 당연히 이미지를 가져올 수 없는 경로를 작성하면 에러가 발생하므로 onerror 가 실행
<a> 태그의 href 속성 활용 : href 속성은 연결할 페이지의 링크를 지정. 이 링크에 자바스크립트 삽입 가능
ex) <a href="javascript:alert(1);">TEST</a>
기존 스크립트 내에 존재하는 XSS 취약점 이용 : 기존에 이미 있던 스크립트에서 XSS 취약점이 발견되는 경우 <script> 태그 사용 불필요
ex) <script>var data = "[취약점 존재]"</script> 와 같이 이미 html 내에 스크립트가 존재하고 그 스크립트 내부에 취약점이 있는 경우, 이미 스크립트 내부이기 때문에 <script> 태그를 이용할 필요 없음
<input> 태그 활용 : input 태그의 속성을 활용해 스크립트를 실행
ex) <input type="text" autofocus />
이 외에도 여러가지 우회 방법이 존재합니다
HTML Entity는 HTML의 특수문자 등을 특정 형태로 치환한 텍스트입니다

주로 XSS 공격에 활용되는 < , > , ' , " 이 4개의 특수문자를 HTML Entity 표현으로 바꿉니다
HTML 특수 문자를 HTML Entity로 바꾸면 안되는 곳은 어디일까요?
바로 HTML 에디터입니다
종종 게시판이나 블로그 같은 곳에 HTML 에디터 기능이 탑재되어 있는데요,
이 기능에서는 HTML 특수문자를 특수문자 그대로 받아들여야 하니 HTML Entity를 활용한 XSS 대응이 어렵습니다
그렇다면 이런 HTML 에디터에서는 어떻게 XSS 공격에 대응해야 할까요?
👉 가능하다면 HTML 에디터 기능 삭제
HTML 에디터 기능이 꼭 필요한 게 아니라면 삭제합니다
👉 삭제 할 수 없다면 아래의 대응 방법 시행
우선 입력 파라미터에서 HTML 특수문자를 전부 HTML Entity로 치환합니다
허용할 tag를 식별하고 그 tag를 다시 HTML 특수문자로 복구합니다(화이트리스트 기반 필터링)
복구한 tag 내 악의적인 event handler를 제거합니다(블랙리스트 기반 필터링)