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'],
allowedAttributes: { a: ['href'] },
allowedFrameHostnames: ['www.youtube.com']
});
console.log(sanitizedDescription);
- Lucy-XSS-filter가 Json 요청은 처리하지 않음
- 서블릿 필터 동작방식과 데이터 읽기 방식에 차이가 존재하기 때문
- Lucy는 HttpServletRequest.getParameters()를 가로채도록 설계되어있는데, JSON은 이 메서드를 통해 전달되지않음
- JSON은 request.getInputStream(), getReader()를 호출해야하는데, 전자의 한계는 HTTP요청의 Body 스트림은 한번만 읽을 수 있어, ContentCachingRequestWrapper와 같은 아이가 본문을 복사해두어야함 후자의 한계는 목적 자체가 form 태그를 통한 공격을 막기 위해 만들어졌다는 것
대안 방법
→ Jackson ObjectMapper custom 시행
참고 문서
https://riverblue.tistory.com/46