[JavaScript] 크로스사이트 스크립트(XSS)

Rachaen·2023년 1월 12일
0

CS

목록 보기
1/1

크로스사이트 스크립트 공격

  • Cross-site script Attacks
  • 웹사이트에 악성코드를 삽입하는 공격 방법
  • 공격자는 대상 웹 응용 프로그램의 결함을 이용해 악성코드를 사용자에게 보낸다. (일반적으로 클라이언트 측 자바스크립트 사용)
  • XSS 공격은 일반적으로 호스트 자체보다 사용자를 목표로 삼음
  • 공격자가 웹 응용프로그램을 속여 브라우저에서 실행될 수 있는 형식의 데이터(코드)를 다른 사용자에게 전달할 때 발생
  • 공격자가 임의로 구성한 기본 웹 코드 외에도 악성코드 다운로드, 플러그인 또는 미디어 콘텐츠를 이용할 수 있음
  • 사용자가 폼 양식에 입력한 데이터 또는 서버에서 클라이언트 단말(브라우저) 전달된 데이터가 적절한 검증 없이 사용자에게 표시되도록 허용하는 경우 발생
    XSS

XSS 공격 유형

Reflective XSS(or Non-persistent XSS)

  • 공격 코드를 사용자의 HTTP 요청에 삽입한 후, 해당 공격 코드를 서버 응답 내용에 그대로 반사(Reflected)시켜 브라우저에서 실행하는 공격기법
  • 공격을 수행하기 위해서는 공격자가 만든 서버로 사용자가 데이터를 보내도록 해야함
  • 피해자가 링크를 방문하면 스크립트가 피해자의 브라우저에서 자동으로 실행
  • Reflective XSS 공격 메커니즘: 공개 게시판, 피싱 이메일, 단축 URL, 실제와 유사한 URL
    Reflective XSS

Persistent XSS(or Stored XSS)

  • 신뢰할 수 없거나 확인되지 않은 사용자 입력(코드)이 서버에 저장되고, 이 데이터가 다른 사용자들에게 전달될 때 발생
  • 공격자는 프로필 입력 폼에 악성 스크립트를 주입해 다른 사용자가 프로필을 방문하면 브라우저에서 자동으로 코드가 실행
    Persistent XSS

DOM XSS(or Client-Side XSS)

  • 웹페이지에 있는 사용자 입력값을 적절하게 처리하기 위한 자바스크립트의 검증 로직을 무효화하는 것을 목표
  • 공격 스크립트가 포함된 악성 URL을 통해 전달된다는 관점에서 Relfective XSS와 유사
    - 차이점: 신뢰할 수 있는 사이트의 HTTP 응답에 페이로드를 포함하는 대신 DOM XSS는 DOM 또는 문서 개체 모델을 수정해 브라우저와 독립적인 공격을 실행한다.
  • 공격자는 DOM XSS 공격을 통해 세션 및 개인 정보를 포함한 쿠키 데이터를 피해자의 컴퓨터에서 공격자 시스템으로 전송할 수 있음
    - 특정 웹사이트에 악의적인 요청을 보낼 수 있음
  • 신뢰할 수 있는 웹 사이트를 모방하고 피해자가 암호를 입력하도록 속여 공격자가 해당 웹 사이트에서 피해자의 계정을 손상시키는 피싱 공격으로 이어질 수 있음
    DOM XSS

프론트엔드 안전한 코딩기법

  • 외부 입력값 또는 출력값에 스크립트가 삽입되지 못하도록 문자열 치환 함수를 사용하여 &<>*‘/() 등을
    &amp; &lt; &gt; &quot; &#x27; &#x2F; &#x28; &#x29;로 치환
  • 안전하지 않은 코딩 기법
    <html>
      <body>
         <script>
         const query = "<script>alert('hello world')<"+"/script>";
         async function req() {
         // 사용자가 에디터와 같은 입력 폼에 입력한 데이터를 서버에 저장
         const response = await fetch(`/vuln/search?q=${query}`, { method: 'GET' })
         const data = await response.text();
         // 외부로부터 받은 데이터(HTML 코드)를 아무런 검증 없이 DOM으로 기록
         document.write(data);
         }
         req();
         </script>
      </body>
    </html>
  • 안전한 코딩 기법
    <html>
      <body>
         <script>
         const query = "<script>alert('hello world')<"+"/script>";
         async function req() {
         const response = await fetch(`/vuln/search?q=${query}`, { method: 'GET' })
         const data = await response.text();
         // 외부로부터 받은 데이터를 이스케이프 처리 후 사용
         document.write(decodeURI(encodeURIComponent(data)));
         }
         req();
         </script>
      </body>
    </html>

과학기술정보통신부와 한국인터넷진흥원의 'JavaScript 시큐어코딩 가이드'

profile
개발을 잘하자!

0개의 댓글

관련 채용 정보