[PART5] 운영체제/시스템/보안 - TERMS 07
2025. 7. 11. 12:06

[ TERMS 07 ]  XSS/CSRF

XSS와 CSRF의 차이를 설명하는 이미지(출처 : https://www.insecure.in/blog/xss-vs-csrf)

1. XSS(Cross-Site Scripting)/CSRF(Cross-Site Request Forgery)의 정의

>  XSS

 '사이트 간 스크립팅'이라고 불리며 웹 앱에서 자주 나타나는 취약점 중 하나이다. 해커가 웹 페이지에 악성 스크립트를 삽입해 사용자의 로그인 정보 등을 탈취하는 공격 방식이다.

>  CSRF

 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 하거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법이다.

 XSS와 CSRF는 언뜻 보면 비슷해 보이지만 XSS는 공격 대상이 클라이언트이고, CSRF는 서버이다.

 

2. XSS/CSRF는 어디서 접하게 될까?

>  XSS

 발신자가 불분명한 이메일에서 자주 확인 가능하다. 해당 이메일을 클릭시 XSS 공격으로 공격자가 로그인된 사용자의 정보를 가져간다. 특정 스크립트 명령어가 삽입된 이메일을 클릭하면 PC가 악의적인 사이트에 자동 접속하여 저장 자료를 절취하는 악성코드를 설치하게 될 수 있다. 이렇듯 특정 스크립트 명령어를 넣는 공격 방식이 XSS이다.

 

>  CSRF

 과거 한 대형 쇼핑업체에서 CSRF 공격을 당한적이 있다.

  1. 쇼핑 업체의 한 관리자가 로그인 상태로 작업을 하던 중 메일을 확인했다.
  2. 공격자는 태그가 들어간 코드를 관리자 메일로 발송했고, 관리자는 내용 이미지 크기가 0이었기 때문에 전혀 알지 못했다.
  3. 관리자가 이메일을 열자 이미지 파일을 받아오기 위해 URL이 열렸다.
  4. 공격자는 쿠키를 통해 관리자의 정보를 빼냈다.

 

3. XSS/CSRF 알아보기

>  XSS 공격 방식

  • Stored XSS

Stored XSS의 공격 방식을 설명하는 이미지(출처 : https://www.inspectiv.com/articles/differences-of-stored-xss-and-reflected-xss)

 접속자가 많은 웹 사이트를 대상으로 XSS 취약점이 있는 웹 서버에 공격자가 악의적인 스크립트를 입력해 놓고, 사용자가 해당 페이지를 읽는 순간 사용자의 브라우저를 공격하는 방식이다. 가장 일반적인 예로는 게시판의 HTML 문서 안에 <script></script>를 이용하여 악성 스크립트를 삽입하는 방식이 있다.

 공격자는 XSS 공격 스크립트를 웹 사이트의 게시판 등에 삽입한 후 사용자가 그 게시물을 클릭할 때까지 기다린다. 사용자가 게시물을 열람하는 순간 스크립트 코드가 사용자에게 전달된다. 이때 웹 브라우저는 스크립트 코드를 실행하고 사용자의 세션 쿠키 정보가 공격자에게 전달된다. 이후 공격자는 세션 쿠키를 사용해 사용자의 권한으로 웹 사이트 접속이 가능해진다. 즉 Stored XSS는 악의적인 스크립트 코드가 DB에 저장되고, 사용자가 클릭할 때마다 구현된다는 특징이 있다.

 

  • Reflected XSS

Reflected XSS의 공격 방식을 설명하는 이미지(출처 : https://www.inspectiv.com/articles/differences-of-stored-xss-and-reflected-xss)

 악성 스크립트가 포함된 URL을 사용자가 클릭하도록 유도하여 클라이언트를 공격하는 방법이다.

 브라우저는 URL을 통해 서버에서의 검색 결과를 전달한다. 하지만 서버가 존재하지 않는 경우 HTML 페이지에포함된 악성 스크립트가 브라우저에서 실행된다. Reflected XSS 공격은 이메일이나 다른 웹 사이트 등 다양한 경로로 피해자 시스템에 전딜된다. Stored XSS와 다르게 DB에  저장되지 않고 응답 페이지로 바로 클라이언트에게 전달된다는 차이점이 있다.

 

>  CSRF 공격 방식

CSRF의 공격 방식을 설명하는 이미지(출처 : https://www.wallarm.com/what/what-is-cross-site-request-forgery)

  사용자의 의지와 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 하는 공격이다. 즉, 조작된 정보가 삽입된 게시물이나 이메일을 클릭하면 사용자의 권한으로 의도하지 않은 조작된 요청을 웹 서버에 전송하여 회원정보를 변경하거나 게시판 설정을 변경하는 등의 행위가 발생하는 공격 방법이다.

 

4. XSS/CSRF를 알아야 하는 이유

 카페를 이용하다 보면 무분별한 광고 게시판을 볼 수 있다. 이 스팸 광고들은 CSRF 공격에 의해 발생된 것이고, 개발자들은 사용자들이 불편을 겪지 않도록 적절한 대응을 해야 한다.

 

5. XSS/CSRF 더 알아보기

>  XSS 공격 대응 방안

  XSS 공격은 주로 해커가 스크립트를 삽입하는 방식이기 때문에 기본적으로 스크립트 태그를 사용한다. 따라서 스크립트에 들어가는 '<','>'등과 같은 문자를 필터링 하는 방법으로 공격을 막을 수 있다. 대표적으로 '<','>'를 대체하기 위해 '&lt','&gt'를 사용한다. 사용자에게는 '<','>'와 동일하게 보이지만 브라우저는 스크립트로 인식하지 않아 실행하지 않는다. 다른 방법으로는 스크립트를 실행할 수 있는 브라우저의 HTML 파서가 동작하지 않도록 'innerHTML' 대신에 'textContent'또는 'innerText'를 사용하는 방법이 있다.

 

>  CSRF 공격 대응 방안

  • 리퍼럴(Referrer) 검증

 백엔드 단에서 요청의 리퍼럴을 확인하여 도메인이 일치하는지 검증하는 방법이다. 도메인 단위 검증에서 페이지 단위 일치 여부까지 검증하면 같은 도메인 내 다른 페이지에서의 XSS 취약점에 의한 CSRF 공격을 어느정도 방어할 수 있다.

 

  • CSRF 토큰(Token)

 CSRF 토큰은 임의의 난수를 생성하고 세션에 저장한다. 그리고 사용자가 요청할 때마다 해당 난수 값을 포함하여 전송한다. 이후 백앤드에서는 요청을 받을 때마다 세션에 저장된 토큰 값과 요청된 파라미터에 전달된 토큰의 일치 여부를 검사한다.

 

  • 캡차(Captcha)

 캡차는 게시물을 쓰는 사람이 로봇인지 검증하는 장치이이다. 컴퓨터는 판단하기 어렵지만 사람은 식별할 수 있는 이미지로 글씨를 판단하게 하여 사람임을 증명하는 기법으로 CSRF에 대응한다.

 

>  함께 알면 좋은 용어

  • sanitize-html
  • Lucy-xss-servlet-filter