불완전한 출력 인코딩/이스케이프 (Improper Output Encoding/Escaping)

Improper Encoding or Escaping of Output

설명

자바스크립트의 $STR.replace('문자', '바꿀값')와 같이 문자열로 검색할 때는 첫 번째로 만나는 문자열만 변경합니다. 만약 이 기능을 보안 목적(예: 위험 문자의 이스케이프)으로 사용하면 나머지 동일한 위험 문자가 제대로 필터링되지 않아 우회 공격이 발생할 수 있습니다. 예를 들어, 단일 replace만 쓸 경우 여러 특수문자 중 첫 번째만 바뀌고 이후 값은 그대로 남아 공격자가 악의적으로 시스템을 조작할 가능성이 생깁니다.

잠재적 영향

  • 출력 데이터 변조 (출력 데이터 위변조): 모든 위험 요소가 변환되지 않아 공격자가 스크립트 삽입, SQL 인젝션 등으로 시스템을 공격할 수 있습니다.

  • 우회 공격 가능성 (필터 우회): 충분한 이스케이프가 안될 경우 필터링을 쉽게 우회할 수 있습니다.

해결 방법

  • 정규표현식과 전역(g) 플래그를 사용하여 모든 발생 사례를 치환하세요. (예: replace(/'/g, "''"))

  • 혹은 신뢰할 수 있는 외부 sanitization 라이브러리(예: DOMPurify, lodash escape 등)를 사용하여 제대로 이스케이프 처리 하세요.

  • 위험 문자 전부를 커버하도록 필터나 이스케이프 로직을 설계하세요.

취약한 코드 및 안전한 코드 예시

취약한 코드

function escapeQuotes(s) {
  return s.replace("'", "''");
}

function escapeHtml(html) {
  return html.replace("<", "").replace(">", "");
}

안전한 코드

설명:

  • 취약한 코드: .replace("특수문자", ...) 방식은 해당 문자가 처음 등장할 때만 치환하고, 두 번째 이후로는 변경이 일어나지 않습니다. 따라서 여러 번 등장하는 위험 문자를 모두 이스케이프 할 수 없어 취약점이 발생합니다.

  • 안전한 코드: 정규표현식과 전역(g) 플래그 /문자/g를 사용하면 문자열 내 모든 위험 문자를 완전히 이스케이프할 수 있습니다. 이렇게 하면 우회나 반복 등장 문제를 예방할 수 있습니다.

참조

Last updated