URL 매개변수, POST 데이터 페이로드 또는 쿠키와 같은 사용자 제공 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 또한 웹 서버는 HTTP 요청을 처리할 때 사용자가 제공한 데이터를 사용자에게 다시 전송되는 HTTP 응답 본문으로 복사할 수 있습니다. 이러한 동작을 “리플렉션”이라고 합니다. 오염된 데이터를 반영하는 엔드포인트를 통해 공격자는 결국 사용자의 브라우저에서 실행될 코드를 삽입할 수 있습니다. 이를 통해 민감한 정보에 액세스/수정하거나 다른 사용자를 사칭하는 등 다양하고 심각한 공격이 가능해질 수 있습니다.
일반적으로 해결책은 다음 중 하나입니다:
- 화이트리스트를 기반으로 사용자가 제공한 데이터의 유효성을 검사하고 허용되지 않은 입력은 거부합니다.
- 악의적인 목적으로 사용될 수 있는 모든 문자로부터 사용자 제공 데이터를 실행되지 않도록 적절하게 치환합니다.
- 사용자가 제공한 데이터가 HTTP 응답에 다시 반영될 때 인코딩합니다. 예를 들어 HTML 콘텐츠에는 HTML 인코딩을, 속성 값에는 HTML 속성 인코딩을, 서버에서 생성된 JavaScript에는 JavaScript 인코딩을 사용하도록 출력 컨텍스트에 맞게 인코딩을 조정합니다. 데이터를 실행되지 않도록 적절하게 치환하거나 인코딩할 때는 보안 목적으로 특별히 설계된 라이브러리만 사용하는 것이 좋습니다. 또한 사용 중인 라이브러리가 적극적으로 유지 관리되고 있는지, 최근에 발견된 취약점을 최신 상태로 유지하고 있는지 확인하세요.
규칙을 어긴 코드
templates/xss_shared.html
<!doctype html>
<title>Hello from Flask</title>
<h1>Hello, World!</h1>
xss.py
from flask import request, make_response
@xss.route('/insecure/no_template_engine_replace', methods =['GET'])
def no_template_engine_replace():
param = request.args.get('param', 'not set')
html = open('templates/xss_shared.html').read()
response = make_response(html.replace('', param)) # 규칙을 준수하지 않은 코드: param이 적절하게 치환되지 않습니다
return response
규칙을 준수한 해결책
templates/xss_shared.html
<!doctype html>
<title>Hello from Flask</title>
<h1>Hello, World!</h1>
xss.py
from flask import request, make_response
from markuptsafe import Markup
@xss.route('/secure/no_template_engine_sanitized_Markup_escape', methods =['GET'])
def no_template_engine_sanitized_Markup_escape():
param = request.args.get('param', 'not set')
param = Markup.escape(param)
html = open('templates/xss_shared.html').read()
response = make_response(html.replace('', param )) # 규칙을 준수한 코드: 'param'은 Markup.escape에 의해 치환됩니다
return response
같이보면 좋은 자료
- OWASP Top 10 2021 Category A3 - 인젝션
- OWASP Cheat Sheet - XSS 예방 치트 시트
- OWASP Top 10 2017 Category A7 - 크로스-사이트 스크립팅 (XSS)
- MITRE, CWE-79 - 웹 페이지 생성 중 입력의 부적절한 중화 (‘Cross-site Scripting’)
-
SANS Top 25 - 구성 요소 간의 불안정한 상호 작용
If you like SONARKUBE, don’t forget to give me a star.