XSS 공격 사례 스터디 (나무위키)
2025-04+ 이전에 정보보안 과목 자유 리포트를 위해 노션에 정리하였던 내용을 옮겼습니다.
공격 유형
: XSS공격 대상
: 나무위키 (namu.wiki)취약점
: 마크다운 파서-렌더러 에서의 취약점으로 인한 임의 코드 실행피해
:- ‘자동 로그인을 사용 중이고 당시 공격 목표 리소스에 접속한 8명의 자동 로그인 토큰 유출’ → 기밀성 훼손
- 서비스의 데이터 훼손 → 위의 계정 탈취로 인한 피해 + 복구 가능한 훼손 → 일시적 무결성 훼손
- 공격자에 의해 비정상적인 방법으로 사용자를 리다이렉팅 → 가용성 훼손 (리다이렉팅 스크립트 주입이 이루어진 문서에서는 정상 동작이 어려워짐)
ref. 해당 사이트 개발자의 보고서: https://theseed.io/w/2017년 나무위키 XSS 공격 보고서
공격 대상 사이트의 간략한 설명
해당 사이트의 기능
- 나무위키는 내부적으로 나무위키의 문법을 파싱하고 렌더링하기 위한
파서
를 가지고 있습니다. 토론
기능 (←실제 공격이 수행된 리소스)- 나무위키는 문서 내용 수정에 관한 논의를 하기위한
스레드 형식
의 게시판을 제공합니다. - 해당 기능에서 또한 나무위키의 자체 마크다운 문법을 지원합니다.
- 나무위키는 문서 내용 수정에 관한 논의를 하기위한
자동 로그인
- 나무위키는 자동 로그인을 지원하고, 이를 위한 쿠키 정보가 유저의 기기에 저장됩니다.
XSS 공격 유형에 대한 설명
XSS
란,Cross-site Scripting
의 약자 입니다.- 크로스 사이트 스크립팅 (XSS)은 공격자가 웹사이트에 악성 클라이언트 사이드 코드를 삽입할 수 있도록 하는 보안 취약점 공격입니다. (MDN web docs_ 인용)
- 오픈 웹 애플리케이션 보안 프로젝트에 따르면, XSS는 2017년에 7번째로 흔한 웹 앱 취약점이었습니다. (MDN web docs_ 인용)
- 즉 사용자의 클라이언트에서 공격자가 원하는 임의의 코드를 실행하도록 하는 공격입니다. (예를 들면 임의의 javascript 코드 실행)
취약점 설명
[[파일:<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>]]
- 위 입력은 해당 파일을 찾아서, 파일이 이미지이면 이미지를 보여주는 입력입니다.
- 위와 같은 XSS 공격 입력이 들어왔을 때, “
<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>
” 위 이름을 가진 파일을 찾지 못하여 fallback 이 실행되었습니다. - fallback 은 위 입력에서 html 문법에 매칭될 수 있는 텍스트(혹은 특수문자)를 찾아서, escape character (
\
) 처리를 해주어야 했습니다. - 그런데 개발자의 부주의로 escape 처리가 없었습니다. 따라서 위의
<script>
가 실제 태그로써 동작하도록 html이 생성되었습니다.
위는 XSS 공격의 직접적인 원인이 된 렌더링 과정의 취약점입니다. 실제 피해 내용은 다른 취약점이 결합되어서 발생하였습니다.
HttpOnly ref. mdn web docs_
- XSS 공격 피해를 방지하기 위해서 쿠키에는 HttpOnly 속성이 존재합니다.
- 해당 속성이 걸린 쿠키는 클라이언트가 javascript의
document.cookie
로 접근할 수 없습니다. 일반 로그인 토큰
은 해당 속성이 걸려있었지만, 개발자의 부주의로자동 로그인 토큰
에는 이 속성이 걸려있지 않았던 취약점이 존재하였습니다.
CSP 의 주요 정책에 대한 비활성화 (인라인 스크립트)
- CSP의 주요한 정책중 하나는
인라인 스크립트
를 비활성화 하는 것입니다. 인라인 스크립트
는 html 의<script>
태그를 말합니다.- 하지만 당시 나무위키는 어떤 이유로
인라인 스크립트
를 허용하기 위해서unsafe-inline
지시문을 포함하였습니다. (현재는 모르겠습니다) - 나무위키의 개발자는 이에 대해 ‘기술 부채’ 로 인하여 이와 같은 취약점 후보를 방치하였다고 합니다.
피해 설명
- 공격을 받은 토론 스레드에 접속한 사용자가 원치 않은 사이트로 리다이렉트 되었습니다.
공격 코드 :[[파일:<script>location.assign('https://공격자가.의도한.사이트');</script>]]
- 자동 로그인 인증에 필요한 토큰(비밀키)이 (공격자를 포함한) 불특정 다수에게 노출되었습니다.
공격 코드 :[[파일:<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>]]
[이에 대한 부연 설명]
CSP
이 나무위키에 적용되었기 때문에, 토큰을 XHR
(javascript의 http request api) 이나 <img>
태그 등의 방법으로 다른 서버 에 http로 날리는 행위가 불가능합니다. 따라서 공격자는 해당 토론
기능이 글을 작성할 수 있는 공간임을 이용하여, 쿠키를 입력창의 입력값으로 넣고 submit()
하였습니다.
이는 사용자가 직접 글을 작성하는 행위와 기능적으로 동일하기에, 사용자가 제출한 요청이 맞는지 확인하는 CSRF 방지 토큰과 같은 방법으론 해결할 수 없었습니다. (그리고 사실 CSRF 방지가 적용이 안되어 있었다고 합니다.)
아무튼 CSP
는 XSS
가 성공하더라도 피해를 줄일 뿐인 것 같습니다.
- 관리 권한이 있는 계정이 탈취됨으로 인해 일반 유저가 수정하지 못하는 문서가 훼손되었습니다. (이는 나무위키에 각 문서에 버전 관리 시스템 기능이 있어서 쉽게 복구된 것 같습니다)
여러 다양한 추가 피해를 일으킬 수도 있었을텐데, 아마 공격자에게 그러한 의도가 없었을 것 같습니다.
감상?평
개발적인 관점에서는 취약점이 되기 쉬운 약점에 대해서는 1순위로 리팩토링해야 되지 않을까 생각합니다. 이를 미루는 순간 기술 부채가 쌓이는 것이죠. 저도 개발상의 편의로 보안 정책을 우회한 다음 todo
로 주석에 달아놓고 안고친 경험이 있는데, 반성해야겠습니다.
또한 역시 스크립트 인젝션 공격은 끝이 없다고 느낍니다. 모든 입력을 철저하게 검증하는 것이 중요하다고 느낍니다.