포스트

XSS 공격 사례 스터디 (나무위키)

2025-04+ 이전에 정보보안 과목 자유 리포트를 위해 노션에 정리하였던 내용을 옮겼습니다.

  • 공격 유형: XSS
  • 공격 대상: 나무위키 (namu.wiki)
  • 취약점: 마크다운 파서-렌더러 에서의 취약점으로 인한 임의 코드 실행
  • 피해 :
    • ‘자동 로그인을 사용 중이고 당시 공격 목표 리소스에 접속한 8명의 자동 로그인 토큰 유출’ → 기밀성 훼손
    • 서비스의 데이터 훼손 → 위의 계정 탈취로 인한 피해 + 복구 가능한 훼손 → 일시적 무결성 훼손
    • 공격자에 의해 비정상적인 방법으로 사용자를 리다이렉팅 → 가용성 훼손 (리다이렉팅 스크립트 주입이 이루어진 문서에서는 정상 동작이 어려워짐)

ref. 해당 사이트 개발자의 보고서: https://theseed.io/w/2017년 나무위키 XSS 공격 보고서

공격 대상 사이트의 간략한 설명


해당 사이트의 기능

  1. 나무위키는 내부적으로 나무위키의 문법을 파싱하고 렌더링하기 위한 파서를 가지고 있습니다.
  2. 토론 기능 (←실제 공격이 수행된 리소스)
    1. 나무위키는 문서 내용 수정에 관한 논의를 하기위한 스레드 형식의 게시판을 제공합니다.
    2. 해당 기능에서 또한 나무위키의 자체 마크다운 문법을 지원합니다.
  3. 자동 로그인
    1. 나무위키는 자동 로그인을 지원하고, 이를 위한 쿠키 정보가 유저의 기기에 저장됩니다.

XSS 공격 유형에 대한 설명


  1. XSS 란, Cross-site Scripting 의 약자 입니다.
  2. 크로스 사이트 스크립팅 (XSS)은 공격자가 웹사이트에 악성 클라이언트 사이드 코드를 삽입할 수 있도록 하는 보안 취약점 공격입니다. (MDN web docs_ 인용)
  3. 오픈 웹 애플리케이션 보안 프로젝트에 따르면, XSS는 2017년에 7번째로 흔한 웹 앱 취약점이었습니다. (MDN web docs_ 인용)
  4. 즉 사용자의 클라이언트에서 공격자가 원하는 임의의 코드를 실행하도록 하는 공격입니다. (예를 들면 임의의 javascript 코드 실행)

취약점 설명


[[파일:<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>]]

  1. 위 입력은 해당 파일을 찾아서, 파일이 이미지이면 이미지를 보여주는 입력입니다.
  2. 위와 같은 XSS 공격 입력이 들어왔을 때, “<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>” 위 이름을 가진 파일을 찾지 못하여 fallback 이 실행되었습니다.
  3. fallback 은 위 입력에서 html 문법에 매칭될 수 있는 텍스트(혹은 특수문자)를 찾아서, escape character (\) 처리를 해주어야 했습니다.
  4. 그런데 개발자의 부주의로 escape 처리가 없었습니다. 따라서 위의 <script> 가 실제 태그로써 동작하도록 html이 생성되었습니다.

위는 XSS 공격의 직접적인 원인이 된 렌더링 과정의 취약점입니다. 실제 피해 내용은 다른 취약점이 결합되어서 발생하였습니다.

HttpOnly ref. mdn web docs_

  1. XSS 공격 피해를 방지하기 위해서 쿠키에는 HttpOnly 속성이 존재합니다.
  2. 해당 속성이 걸린 쿠키는 클라이언트가 javascript의 document.cookie로 접근할 수 없습니다.
  3. 일반 로그인 토큰은 해당 속성이 걸려있었지만, 개발자의 부주의로 자동 로그인 토큰 에는 이 속성이 걸려있지 않았던 취약점이 존재하였습니다.

CSP 의 주요 정책에 대한 비활성화 (인라인 스크립트)

  1. CSP의 주요한 정책중 하나는 인라인 스크립트를 비활성화 하는 것입니다.
  2. 인라인 스크립트는 html 의 <script> 태그를 말합니다.
  3. 하지만 당시 나무위키는 어떤 이유로 인라인 스크립트허용하기 위해서 unsafe-inline 지시문을 포함하였습니다. (현재는 모르겠습니다)
  4. 나무위키의 개발자는 이에 대해 ‘기술 부채’ 로 인하여 이와 같은 취약점 후보를 방치하였다고 합니다.

피해 설명


  1. 공격을 받은 토론 스레드에 접속한 사용자가 원치 않은 사이트로 리다이렉트 되었습니다.

공격 코드 :[[파일:<script>location.assign('https://공격자가.의도한.사이트');</script>]]

  1. 자동 로그인 인증에 필요한 토큰(비밀키)이 (공격자를 포함한) 불특정 다수에게 노출되었습니다.

공격 코드 :[[파일:<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>]]

[이에 대한 부연 설명]

CSP 이 나무위키에 적용되었기 때문에, 토큰을 XHR(javascript의 http request api) 이나 <img> 태그 등의 방법으로 다른 서버 에 http로 날리는 행위가 불가능합니다. 따라서 공격자는 해당 토론 기능이 글을 작성할 수 있는 공간임을 이용하여, 쿠키를 입력창의 입력값으로 넣고 submit() 하였습니다.

이는 사용자가 직접 글을 작성하는 행위와 기능적으로 동일하기에, 사용자가 제출한 요청이 맞는지 확인하는 CSRF 방지 토큰과 같은 방법으론 해결할 수 없었습니다. (그리고 사실 CSRF 방지가 적용이 안되어 있었다고 합니다.)

아무튼 CSPXSS 가 성공하더라도 피해를 줄일 뿐인 것 같습니다.

  1. 관리 권한이 있는 계정이 탈취됨으로 인해 일반 유저가 수정하지 못하는 문서가 훼손되었습니다. (이는 나무위키에 각 문서에 버전 관리 시스템 기능이 있어서 쉽게 복구된 것 같습니다)

여러 다양한 추가 피해를 일으킬 수도 있었을텐데, 아마 공격자에게 그러한 의도가 없었을 것 같습니다.

감상?평


개발적인 관점에서는 취약점이 되기 쉬운 약점에 대해서는 1순위로 리팩토링해야 되지 않을까 생각합니다. 이를 미루는 순간 기술 부채가 쌓이는 것이죠. 저도 개발상의 편의로 보안 정책을 우회한 다음 todo 로 주석에 달아놓고 안고친 경험이 있는데, 반성해야겠습니다.

licence-plate-sql-injection.png

또한 역시 스크립트 인젝션 공격은 끝이 없다고 느낍니다. 모든 입력을 철저하게 검증하는 것이 중요하다고 느낍니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.