1. 결함의 본질
입력이 코드로 해석되게 만드는 결함 이 한 가지 결함이 출력 위치 3개에서 발현
2. 공격 대상
사용자(피해자 브라우저) 공격자 코드를 피해자 브라우저에서 실행시켜 쿠키 탈취, 화면 조작, 세션 도용 등 진행
3. 전제 조건
- 사용자 입력이 페이지에 출력되는 지점의 존재
- 그 출력이 이스케이프 없이 HTML/JS로 해석
4. 공격 경로
출력이 일어나는 위치에 따라 세 가지로 갈린다.
| 종류 | 출력 위치 | 경로 | 판별점 |
|---|---|---|---|
| Stored | DB → 응답 | 입력(댓글·게시글) → DB 저장 → 열람 시 응답에 출력 | 저장됐다 나중에 나오는가? |
| Reflected | 서버 응답(즉시) | URL 파라미터에 박음 → 클릭 → 서버가 응답에 출력 | 서버 응답에 박혀 나오는가? |
| DOM | 클라 JS → DOM | URL(#)에 박음 → 클릭 → JS가 읽어 DOM에 꽂음 | 서버 안 거치고 JS가 DOM에 넣는가? |
5. 판별점
입력점 찾기 → 그 값이 어디에서 출력되는지 추적 → 이에 따른 종류 결정 저장되었다 나오면 stored, 서버가 즉시 반사하면 reflected, 클라이언트 JS가 DOM에 꽂으면 DOM
6. 방어
결함은 오직 하나: 입력이 코드로 출력 따라서 방어도 오직 하나: 출력 시 맥락에 맞게 이스케이프