크로스 사이트 스크립팅 (XSS) - script tag

Cross-site Scripting (XSS)

설명

외부에서 제어하는 문자열을 <script> 요소의 JavaScript 소스로 직접 삽입하면 공격자가 페이지의 권한으로 코드를 실행할 수 있습니다. HTML 텍스트용 이스케이프나 HTML 정화만으로 임의의 JavaScript 소스를 안전하게 만들 수는 없습니다.

잠재적 영향

  • 세션 탈취 (세션 하이재킹): 공격자가 사용자의 인증 정보를 탈취할 수 있습니다.
  • 악성 코드 실행 (클라이언트 공격): 사용자의 브라우저에서 임의의 스크립트를 실행할 수 있습니다.
  • 피싱 공격 (신뢰도 하락): 정상 사이트에서 악성 팝업, 입력 폼 등으로 사용자를 속일 수 있습니다.

해결 방법

  • 외부 입력을 실행할 JavaScript 소스로 직접 사용하지 마세요.
  • 필요한 동작을 고정 코드로 작성하고, 외부 값은 허용된 식별자에 대응하는 동작만 선택하도록 하세요.
  • 데이터를 전달할 때는 코드와 분리하고, 실제 출력 문맥에 맞는 직렬화와 처리를 사용하세요.

예시

변경 전

javascript
// 취약한 코드 예시
const userInput = req.query.data;
const html = `<script>${userInput}</script>`;
res.send(html);

변경 후

javascript
// 고정된 스크립트 선택
const userInput = req.query.data;
let scriptSource = "alert('prepare')"
if (userInput == "test") {
    scriptSource = "alert('test')"
}
const html = `<script>${scriptSource}</script>`;
res.send(html);

설명:

  • 변경 전: 요청의 data 값을 스크립트 본문에 그대로 삽입합니다.
  • 변경 후: 입력은 test라는 식별자와 비교할 뿐이며, 응답에 들어갈 스크립트는 코드에 고정되어 있습니다. 입력 문자열 자체를 실행 코드에 넣지 않습니다.

참조