크로스 사이트 스크립팅 (XSS)
Cross-Site Scripting (XSS)
설명
크로스 사이트 스크립팅(XSS)은 웹 페이지를 만들 때 사용자 입력을 제대로 HTML 이스케이프하지 않고 그대로 출력할 때 발생하는 취약점입니다. 공격자는 <script> 태그나 이벤트 핸들러(onclick 등) 같은 스크립트 코드를 입력값에 섞어 넣고, 이 값이 브라우저에 그대로 출력되면 피해자의 브라우저에서 악성 JavaScript가 실행됩니다. 이 취약점은 쿠키 탈취, 세션 하이재킹, 피싱 페이지 삽입, 키로깅 등으로 악용될 수 있습니다.
잠재적 영향
세션 탈취 및 계정 도용: 브라우저에 저장된 세션 쿠키를 탈취해 사용자 계정으로 로그인할 수 있습니다.
악성 스크립트 실행: 피해자 브라우저에서 임의의 JavaScript를 실행해, DOM 조작, 악성 사이트 리다이렉트, 키 입력 기록 등이 가능합니다.
피싱 및 UI 변조: 화면 내용을 조작해 가짜 로그인 폼이나 결제 화면을 띄워 민감 정보를 탈취할 수 있습니다.
신뢰도 하락: 사용자가 악성 팝업, 리다이렉트 등을 겪으면서 서비스에 대한 신뢰가 떨어지고, 법적/금전적 손실로 이어질 수 있습니다.
해결 방법
html/template 사용: Go에서는
html/template패키지를 사용해 템플릿을 렌더링하면, 기본적으로 HTML 이스케이프가 적용되어 XSS 위험이 크게 줄어듭니다.직접 Write 지양:
http.ResponseWriter.Write()를 사용할 때, 사용자 입력이 섞인 문자열을 직접 만들어서 쓰지 말고, 템플릿 렌더링 결과를 쓰도록 합니다.신뢰할 수 없는 입력 이스케이프: URL, HTML 속성, JavaScript 컨텍스트에 넣을 값은 각각에 맞는 이스케이프 함수를 사용합니다. (예: URL 인코딩, HTML 이스케이프 등)
컨텍스트에 맞는 템플릿 설계: 사용자 입력을
<script>블록 안,on*이벤트 속성 안 등에 직접 넣지 말고, 가능하면 데이터 속성(data-*)이나 텍스트 노드로만 사용합니다.입력 검증: URL, 이름, 메시지 등은 허용 가능한 문자/형식(화이트리스트)을 정의하고, 그 외 문자는 거부하거나 정규화합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 취약한 코드에서는
fmt.Sprintf()로 HTML 문자열을 직접 만들고, 그 안에 사용자 입력(url파라미터)을 그대로 삽입한 뒤w.Write()로 브라우저에 전송합니다. 이 과정에서 HTML 이스케이프가 전혀 적용되지 않기 때문에, 공격자가url값에" onclick="alert(1)같은 코드를 넣으면<a>태그 속성이 깨지면서 임의의 JavaScript를 실행할 수 있습니다. 즉,http.ResponseWriter.Write()를 이용해 사용자 입력이 포함된 HTML을 직접 쓰면 XSS에 매우 취약해집니다.안전한 코드: 안전한 코드에서는 Go의
html/template패키지를 사용해 템플릿을 정의하고,template.Execute()를 통해 데이터를 렌더링합니다.html/template는 기본적으로 HTML 이스케이프를 수행하므로, 사용자 입력에<,>,"같은 문자가 있어도 브라우저에서 코드로 인식되지 않고 단순 텍스트로 처리됩니다. 또한,ResponseWriter에는 템플릿이 만들어 준 안전한 결과만 쓰므로 직접 문자열을 조합할 때 발생하는 XSS 위험을 줄일 수 있습니다.
참조
Last updated