불완전한 정규식 검증 우회

불완전한 호스트 검증 정규식 사용

설명

도메인이나 호스트 검증 정규식에서 점(.)을 이스케이프하지 않거나 경계 조건이 부족하면 의도하지 않은 호스트가 허용될 수 있습니다.

잠재적 영향

  • SSRF, 오픈 리다이렉트, 외부 콜백 allowlist 우회로 이어질 수 있습니다.
  • 공격자가 신뢰되지 않은 도메인을 정상 도메인처럼 통과시킬 수 있습니다.

해결 방법

  • 도메인 구분 점은 정규식에서 \.로 이스케이프하세요. Go의 큰따옴표 문자열에서는 \\.로 표기합니다.
  • 가능하면 URL을 파싱한 뒤 정확한 호스트 허용 목록과 비교하세요.

예시

변경 전

go
ok, _ := regexp.MatchString("^api.example.com$", host)

변경 후

go
ok, _ := regexp.MatchString("^api\\.example\\.com$", host)

설명:

  • 변경 전: 호스트명이나 도메인을 검증하는 정규식에서 점(.)을 이스케이프하지 않으면 의도한 도메인보다 훨씬 넓은 입력이 허용될 수 있습니다.
  • 변경 후: Go의 일반 문자열에서 \\.를 쓰면 정규식에는 리터럴 점을 뜻하는 \.가 전달됩니다. 시작과 끝 앵커로 전체 호스트명을 비교합니다.

참조