본문 바로가기

모의해킹 스터디/Week11

XSS 취약점 해결 방안

HTML Entity

HTML Entity는 HTML 문서에서 특정 문자나 기호를 명확하게 표현하기 위해 규정한 코드 규약이다.

문서 작성시에 HTML의 여러 기호와 태그가 혼용되어 사용되는 것을 방지할 수 있다.

 

<예시>

< &lt;
> &gt;
' &apos;
" &quot;

 

function HTMLentity(input) {
    return unsafe
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/'/g, "&apos;")
        .replace(/"/g, "&quot;");
}

 

 

화이트 리스트 기반 필터링

허용된 태그(tag)만 통과시키고 나머지 태그는 모두 차단하는 방식이다.

즉, 화이트 리스트에 포함된 태그들만 이용 가능하며, 나머지 태그들은 모두 차단된다.

 

블랙 리스트 기반 필터링

명시된 특정 태그만 차단하고, 나머지 태그는 모두 허용하는 방식이다.

블랙 리스트에 기록되어 있지 않은 모든 태그들은 이용이 가능하다.

 

  화이트 리스트 기반 필터링 블랙 리스트 기반 필터링
접근 방식 허용된 태그만 통과 명시된 태그만 차단
보안성 높음 낮음
유연성 제한적 유연함
관리 초기 설정이 어려움 지속적인 관리 필요

 


HTML Editor 취약점 해결 방안

HTML Editor 예시

 

HTML Editor는 HTML 코드를 작성할 수 있는 도구를 말한다.

특정 웹 사이트에서는 사용자의 편의를 위해 HTML Editor 기능을 제공해주기도 한다.

하지만 이 HTML Editor에서도 입력값이 그대로 결과로 나타나기 때문에 XSS 공격 취약점이 존재한다.

 

이 XSS 취약점은 HTML Entity를 이용하여 근본적으로 막을 수는 있지만, 사용자가 입력한 코드가 실행되지 않을 수 있는 단점이 존재한다. 따라서 HTML Entity대신 블랙 리스트 기반 필터링으로만 XSS를 막으려고 한다면 예상하지 못한 취약점이 존재할 수 있다.

 

간단한 예시는 아래와 같다.

더보기

글자 수를 제한할 경우

<script src="/a.js"></script>

=> 외부 자바스크립트 파일을 로드하여 우회

 

<script> 를 제한할 경우

<ScRiPt>alert('xss');</ScRiPt>

=> 대소문자를 이용하여 우회

 

<script>를 공백(<>)으로 치환할 경우

<scrscriptipt>alert('xss');</scrscriptipt>

=> 공백으로 필터링 시에 script가 남도록 우회

 

<script>를 <xcript>와 같이 치환할 경우

<img src=x onerror="alert('xss')">

=> 자바스크립트의 event handler를 이용하여 우회

 

따라서 HTML Entity에서는 특히 사용자의 편의와 보안을 동시에 고려하는 방법을 이용해야한다.

 

  1. 파라미터에서 HTML 특수문자들을 전부 HTML Entity로 치환
  2. 허용해줄 tag를 식별하고 특정 tag만 허용 (화이트 리스트 기반 필터링)
  3. 허용한 tag 내에 악의적인 Event Handler를 제한 (블랙 리스트 기반 필터링)

위에서 소개한 3가지 방법을 모두 이용하여 XSS 공격을 예방할 수 있다.

'모의해킹 스터디 > Week11' 카테고리의 다른 글

DOM Based XSS  (1) 2024.07.02