크로스 사이트 스크립팅 (XSS)
Reflected Cross-Site Scripting (XSS)
설명
Reflected XSS는 서버가 사용자 입력을 HTML 이스케이프 없이 그대로 응답에 포함할 때 발생합니다. 공격자는 악성 스크립트를 쿼리스트링/경로 파라미터에 넣은 URL을 피해자에게 클릭하게 하여, 브라우저에서 스크립트가 실행되도록 유도합니다. 이를 통해 쿠키/세션 탈취, DOM 조작, 피싱 UI 삽입 등 다양한 공격이 가능합니다.
잠재적 영향
세션 탈취 및 계정 장악: 악성 스크립트로 세션 쿠키를 탈취하여 사용자 계정에 접근 가능
사용자의 브라우저 내 임의 스크립트 실행: DOM 조작, 키로깅, 내부 요청 전송 등 수행 가능
피싱/가짜 UI 삽입: 로그인 폼 위조, 결제 정보 탈취 등 사회공학 공격 유발
CSRF 우회 보조: 스크립트를 통해 사용자의 권한으로 악의적 요청을 자동 전송
해결 방법
출력 인코딩(HTML 이스케이프) 적용: html.escape, flask.escape, django.utils.html.escape, markupsafe.escape 등을 사용하여 사용자 입력을 HTML 컨텍스트에 맞게 이스케이프하세요.
템플릿 자동 이스케이프 사용: Jinja2/Django 템플릿의 autoescape를 기본값으로 유지하고, 문자열 연결로 HTML을 직접 만들지 마세요.
콘텐츠 타입 명확화: HTML이 아닌 경우 text/plain 또는 JSON 응답(JSONResponse/Flask jsonify)을 사용하여 브라우저의 HTML 파싱을 피하세요.
신뢰 데이터만 safe 처리: 꼭 필요한 경우에만 엄격 검증된 허용 목록 데이터에 한해 safe 표시를 사용하세요.
보안 헤더 병행: Content-Security-Policy(CSP), X-Content-Type-Options 등을 설정해 피해 범위를 줄이세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력 q를 HTML에 그대로 삽입하여, 같은 태그가 그대로 실행됩니다. 공격자는 스크립트를 포함한 링크를 전달해 피해자의 브라우저에서 임의 코드가 실행되도록 만들 수 있습니다.
안전한 코드: 사용자 입력에 escape를 적용해 <, >, &, " 등 특수 문자를 HTML 엔티티로 변환합니다. 이로써 브라우저가 입력값을 스크립트로 해석하지 못해 XSS 실행을 차단합니다.
참조
OWASP: Cross-site Scripting (XSS)
Last updated