XSS 공격 및 lucy-xss-filter 대안

hee·2026년 5월 18일

XSS

  • Cross Site Scripting
  • 게시판이나 웹 메일에 자바 스크립트와 같은 스크립트 코드를 삽입해 개발자가 고려하지 않은 기능이 작동하도록 하는 공격
  • 사용자를 대상으로 한 공격임 대부분

위험성

  • 쿠키 정보 및 세션 ID를 획득할 수 있음
  • 시스템 관리자 권한 획득할 수 있음 (사용자의 브라우저가 악성 데이터를 실행할 수 있도록 함)
  • 악성 프로그램으로 redirect 하거나, 트로이 목마 프로그램을 다운로드 하도록 유도할 수 있다

대안책

  • script 문자 필터링
    • <, >, “, ‘ 과 같은 문자를 필터링 함
    • htmlentities 함수를 사용해 특수문자를 HTML 엔티티로 변환함

java-lucy-filter

  • 지원이 끊겨서 javax→jakarta로 바꾸어 사용 가능 (직접 커스텀)
  • 화이트 리스트 방식 채택
    • 모두가 차단된 상태에서 예외적으로 접근 가능한 대상을 지정
    • 블랙리스트는 기본 정책이 모두 허용된 상태에서 에외적으로 차단하는 대상을 지정

lucy-filter github

취약점 발견

  • 입력단계에서 escape하지만, sanitize-html 모듈 누락 + 출력단계에서는 unescape
const sanitizeHtml = require('sanitize-html');

const dirty = `h1태그는 <h1>링크</h1> 무시가 될까?`;

const sanitizedDescription = sanitizeHtml(dirty, {
    allowedTags:['h1', 'a'], // h1 , a 태그 허용
    allowedAttributes: { a: ['href'] }, // a 태그의 href 속성 허용
    allowedFrameHostnames: ['www.youtube.com'] // iframe 허용하되 유튜브 사이트만 허용
});

console.log(sanitizedDescription); // 출력 : h1태그는 <h1>링크</h1> 무시가 될까?
  • Lucy-XSS-filter가 Json 요청은 처리하지 않음
    • 서블릿 필터 동작방식과 데이터 읽기 방식에 차이가 존재하기 때문
    • Lucy는 HttpServletRequest.getParameters()를 가로채도록 설계되어있는데, JSON은 이 메서드를 통해 전달되지않음
  • JSON은 request.getInputStream(), getReader()를 호출해야하는데, 전자의 한계는 HTTP요청의 Body 스트림은 한번만 읽을 수 있어, ContentCachingRequestWrapper와 같은 아이가 본문을 복사해두어야함 후자의 한계는 목적 자체가 form 태그를 통한 공격을 막기 위해 만들어졌다는 것

대안 방법
→ Jackson ObjectMapper custom 시행

참고 문서
https://riverblue.tistory.com/46

0개의 댓글