웹사이트 보안은 모든 온라인 비즈니스의 성장과 확장에 핵심적인 역할을 합니다. 최근 몇 년간 사이버 공격이 급증하면서 새로운 랜섬웨어와 크립토마이닝 악성코드 변종이 매달 야생에서 발견되고 있습니다. 이는 중소기업일수록 온라인 비즈니스를 안전하게 유지하고 해킹된 웹사이트를 복구하는 데 더 많은 비용을 지출해야 한다는 의미입니다.
Cybersecurity Ventures의 연간 사이버 범죄 보고서에 따르면 사이버 범죄 피해액은 매년 기하급수적으로 증가하고 있으며, 웹사이트 해킹은 그중에서도 가장 빈번하게 발생하는 공격 유형 중 하나입니다.
실제 피해 사례
최근에는 무려 4,600개 이상의 웹사이트가 결제 정보와 사용자 데이터를 탈취하는 악성 코드에 감염되는 사건이 발생했습니다. 피해를 입은 사이트에는 전자상거래 스토어, 블로그, e러닝 사이트 등이 포함되어 있었습니다. 이 악성코드는 Picreel과 Alpaca Form의 CDN(콘텐츠 전송 네트워크)을 통해 사이트에 침투했으며, 탈취한 신용카드 정보는 파나마에 있는 서버로 전송되었습니다. 악성코드의 소스 코드를 분석해보면 데이터 수집 및 전송을 돕는 다양한 함수들이 선언되어 있는 것을 확인할 수 있습니다. 현재도 1,200개 이상의 웹사이트가 Picreel 악성코드 변종에 감염된 상태이며, 3,700개 이상의 사이트에 여전히 Alpaca 공격의 코드가 남아 있습니다.
날로 정교해지는 악성코드 변종이 매일 등장하는 상황에서, 어느 날 갑자기 내 사이트가 다음 희생자가 될지 모릅니다. 따라서 해킹된 웹사이트 복구 방법을 미리 익혀두고 예방 조치를 취하는 것이 매우 중요합니다.
해킹된 웹사이트의 주요 징후
- 사이트에 의심스럽고 출처를 알 수 없는 링크, 파일, 관리자 계정, 웹페이지, 테이블, 스크립트가 나타납니다.
- 방문자를 수상한 도메인으로 유도하는 팝업과 광고가 사이트를 감염시킵니다.
- 웹사이트 속도가 현저히 느려지고 반응하지 않습니다.
- 접속자가 거의 없는데도 서버에 과부하가 걸립니다.
- 사용자들이 내 웹사이트에서 신용카드 정보가 도난당했다고 불만을 제기합니다.
- 일본어 키워드 해킹(Japanese Keyword Hack)이나 파마 해킹(Pharma Hack)으로 인해 알아볼 수 없는 이상한 콘텐츠가 사이트에 표시됩니다.
- 외부 호스팅 서비스를 이용 중이라면 계정이 차단되거나 비활성화됩니다.
- 검색 엔진이 내 웹사이트 방문 시 경고 메시지를 표시합니다.
- 웹사이트 비밀번호가 변경되고, 로그에 무차별 대입(brute force) 로그인 시도 기록이 나타납니다.
- 출처를 알 수 없는 플러그인과 확장 프로그램이 서버에 설치됩니다.
- 내 웹사이트의 메일 서버에서 대량의 스팸 메일이 발송됩니다.
- 웹사이트의 데이터가 인터넷 포럼에서 판매되고 있습니다.
- Wireshark 등 패킷 캡처 도구의 트래픽 로그에서 수상한 도메인으로 데이터가 전송되는 것을 확인할 수 있습니다.
해킹된 웹사이트 복구: 악성코드 제거 단계
- 1단계: 사이트 전체 백업을 먼저 진행합니다. 이후 사이트를 점검 모드(유지보수 모드)로 전환하세요.
- 2단계: 감염 원인을 찾습니다. 스크립트, 파일 또는 특정 웹페이지일 수 있으므로 소스 코드를 확인하여 base64 인코딩 여부를 살펴봅니다. 최근 설치한 플러그인이나 확장 프로그램도 반드시 점검하세요.
- 3단계: 검색 엔진에 의해 블랙리스트에 등재된 경우, Google Search Console을 통해 감염 원인을 확인합니다. 아울러 출처를 알 수 없는 관리자 계정도 삭제해야 합니다. 그래도 문제가 해결되지 않으면 Astra 같은 온라인 바이러스 스캐너를 활용해 보세요.
- 4단계: 감염된 파일에서 악성 코드 라인을 삭제하고, 데이터베이스에서 의심스러운 테이블을 제거합니다. 중요한 파일인데 코드의 용도를 확신할 수 없다면 일단 주석 처리한 후 전문가에게 도움을 요청하세요.
- 5단계: 정리 작업이 끝나면 Google에 사이트를 재제출하여 블랙리스트에서 제거하도록 요청합니다. 또한 해킹의 근본 원인을 파악하고 패치해야 재감염을 막을 수 있습니다.
위 내용은 일반적인 복구 절차이며, 아래에서는 CMS별 맞춤형 복구 방법을 자세히 안내합니다.
OpenCart 악성코드 제거
OpenCart 사용자는 코어 파일의 무결성을 검사하여 감염 원인을 찾아야 합니다. 즉, OpenCart의 핵심 파일은 OCMOD/VQMOD 등 유효한 사유로 수정된 경우를 제외하고 공식 배포본과 달라서는 안 됩니다. Linux의 'diff' 명령어를 활용하면 됩니다. 공식 저장소에서 파일을 로컬 폴더에 다운로드한 후 다음 명령어로 비교하세요.
diff -r path/to/OpenCart/file.php /path/to/official/Opencart/file.php
또한 OpenCart 사용자는 install 폴더를 반드시 먼저 삭제해야 하며, 루트 폴더에서 해당 폴더를 찾을 수 있습니다. 공격자로부터 카탈로그(catalog) 디렉터리를 보호하는 것도 중요합니다. .php, .txt와 같은 민감한 파일에 대한 접근을 차단하려면 catalog 폴더 내 .htaccess 파일에 관련 코드를 추가하세요.
PrestaShop 악성코드 제거
PrestaShop의 경우, 자주 공격받는 모듈들을 점검하여 감염 여부를 확인할 수 있습니다. FTP 클라이언트로 스토어에 접속한 후 다음 폴더들에서 악성 코드를 찾아보세요.
- modules/homepageadvertise/slides
- modules/homepageadvertis2/slides
- modules/productpageadverts/slides
- modules/columnadverts/slides
- modules/simpleslideshow/slides
base64로 인코딩된 것으로 보이는 코드가 있는지 주의 깊게 살펴봅니다. Linux의 Grep 명령어로 확인할 수 있습니다.
find . -name "*.php" -exec grep "base64" '{}' \; -print &> infected.txt
이 명령어는 base64 인코딩된 모든 인스턴스를 infected.txt 파일에 저장합니다. 이후 온라인 도구로 복호화하여 삭제하면 됩니다.
Drupal 악성코드 제거
Drupal의 경우, 우선 /drupal-admin 폴더에 출처를 알 수 없는 파일이 없는지 확인합니다. 주의 깊게 살펴야 할 의심 파일로는 Marvins.php, db_.php, 8c18ee, 83965, admin.php, buddy.strength, dm.php 등이 있으며, 발견 즉시 삭제하세요. 또한 출처를 알 수 없는 데이터베이스 사용자도 제거해야 합니다. 특정 날짜 이후 생성된 사용자가 있는지 확인하려면 다음 SQL 명령어를 사용하세요.
Select * from users as u AND u.created > UNIX_TIMESTAMP(STR_TO_DATE('May 15 2019', '%M %d %Y'));
이 명령어는 2019년 5월 15일 이후 생성된 모든 사용자를 표시합니다. 정리 작업이 완료되면 drush cache-rebuild(Drupal 8) 또는 drush cache-clear all(Drupal 7) 명령어로 캐시를 비우세요.
PHP 악성코드 제거
PHP 사이트의 경우 데이터베이스부터 점검합니다. 먼저 데이터베이스를 백업한 후 phpMyAdmin 같은 도구로 'Sqlmap' 같은 의심스러운 테이블이 있는지 찾아봅니다. 테이블 내용에서 수상한 링크나 악성 코드를 검색하고, 발견되면 해당 항목 또는 필요 시 테이블 전체를 삭제합니다. 이후 사이트가 정상적으로 작동하는지 확인하면 성공적으로 악성코드를 제거한 것입니다.
PHP 파일의 감염 여부는 다음 명령어로 base64 인코딩된 악성 코드를 탐지할 수 있습니다.
find . -name "*.php" -exec grep "base64" '{}' \; -print &> output.txt
base64 인코딩 외에도 FOPO 같은 난독화 기법이 자주 사용됩니다. 출처를 알 수 없는 PHP 스크립트는 삭제하고, 코드 용도를 모르겠다면 주석 처리 후 전문가의 도움을 받으세요. PHP 환경에서는 원격 코드 실행(RCE) 공격에 악용될 수 있는 위험한 함수를 비활성화하는 것이 중요합니다. 다음 설정 한 줄로 가능합니다.
disable_functions = "show_source, system, shell_exec, passthru, exec, popen, proc_open, allow_url_fopen, eval"
때때로 에러 메시지는 공격자가 사이트를 장악하는 데 악용할 수 있는 민감한 정보를 노출합니다. 이런 에러 표시를 끄려면 php.ini 파일에 다음 코드를 추가하세요.
display_errors=Off
log_errors=On
error_log=/var/log/httpd/php_error.log
이 설정은 화면에 에러를 표시하지 않고 대신 php_error.log 파일에 기록하므로, 문제 해결 시 직접 확인할 수 있습니다. 마지막으로 PHP 폼과 입력값 등 서버가 받는 모든 입력값이 필터링되고 있는지 반드시 확인하세요. 검증되지 않은 입력값 하나가 사이트 전체를 마비시킬 수 있습니다. PHP 사이트에 대한 전체 보안 감사를 진행하는 것을 권장합니다.
WordPress 악성코드 제거
WordPress의 경우 핵심(core) 파일부터 점검하세요. 이 파일들의 감염 제거는 비교적 쉽습니다. 또한 시스템 로그에서 파일 변경 이력을 확인하면 악성코드 감염을 식별하는 데 도움이 됩니다. 핵심 파일에 감염이 있다면 공식 저장소의 깨끗한 파일로 교체하면 되며, 테마 파일도 동일하게 적용됩니다. 다만 wp-content, wp-config 같은 민감한 파일과 폴더는 임의로 수정하지 않도록 주의하세요.
악성코드가 새 WordPress 사용자 계정을 만들었다면 즉시 제거해야 합니다. 새롭게 생긴 수상한 계정을 찾아 삭제를 진행하세요.
- wp-admin 대시보드에 접속하여 사용자 > 모든 사용자로 이동합니다.
- 체크박스로 삭제할 사용자를 선택하고 "대량 작업(Bulk Actions)" 드롭다운을 펼칩니다.
- "삭제(Delete)" 옵션을 선택한 후 "적용(Apply)" 버튼을 누릅니다.
또한 이미지 파일도 반드시 점검해야 합니다. bak.bak/Favicon 악성코드 같은 악성코드는 WordPress 사이트를 자주 공격합니다. wp-uploads 폴더를 열어 모든 이미지를 수동으로 검사하세요. 방법은 .ico 파일을 별도 폴더에 복사한 후 확장자를 .txt로 변경하고 텍스트 파일을 여는 것입니다. 내용이 알아볼 수 없는 문자라면 파일은 깨끗한 상태지만, PHP 코드가 보인다면 앞서 안내한 WordPress 복구 절차를 따르세요. 마지막으로 WordPress에서 XML-RPC를 비활성화하는 것도 잊지 마세요.
해킹된 웹사이트 복구를 위한 예방 조치
- 관리자 폴더 이름 변경: 관리자 폴더 URL을 무작위 이름으로 변경하세요. 예를 들어 기존 www.abc.com/admin/을 www.abc.com/random123/으로 바꾸면 무작위 대입 공격의 표적이 되기 어렵습니다.
- 디렉터리 리스팅 비활성화: 디렉터리 인덱싱이 켜져 있으면 해커가 민감한 파일을 열람할 수 있습니다. 각 디렉터리의 .htaccess 파일에 다음 코드를 추가하여 비활성화하세요: Options -Indexes
- CMS 최신 버전 유지: 어떤 CMS를 사용하든 항상 최신 버전으로 유지하세요. 공식 사이트에서 꾸준히 업데이트하는 것이 해킹을 예방하는 건강한 습관입니다.
- 파일 권한 설정: 적절한 파일 권한은 핵심 파일을 공격자로부터 보호합니다. 일반 파일은 644 또는 444로 설정하고, config.php, index.php, admin/config.php, admin/index.php, system/startup.php 같은 민감한 파일은 444로 설정하세요.
- 비밀번호 및 플러그인 관리: 하드코딩되거나 기본값으로 설정된 비밀번호가 없도록 하고, 평판 좋은 테마·확장 프로그램·플러그인만 사용하세요.
- 안전한 호스팅 선택: 저렴한 호스팅 대신 보안이 강화된 호스팅 플랜을 선택하세요. 지금은 저렴해 보여도 해킹 복구 비용이 훨씬 클 수 있습니다. 서버 설정이 올바른지, 개방된 포트나 잘못된 구성이 없는지도 확인하세요.
- SSL 인증서 적용: SSL은 사용자와 사이트 간 통신을 보호할 뿐 아니라 SEO에도 도움이 됩니다. SSL 인증서를 발급받아 서버에 적용한 후, HTTP가 아닌 HTTPS로 항상 리디렉션되도록 설정하세요.
# Redirect HTTP to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
수동 복구 없이 보안 솔루션으로 예방하기
애초에 보안 솔루션이나 방화벽을 갖춰두었다면 번거로운 수동 복구 작업 자체를 피할 수 있었을 것입니다. 요즘은 방화벽뿐 아니라 완전한 보안 스위트를 제공하는 다양한 솔루션이 있습니다. Astra는 확장성이 뛰어나 합리적인 가격에 도입할 수 있으며, 사이트에 취약점이 있더라도 어떤 유형의 공격으로부터도 웹사이트를 보호하는 방화벽을 제공합니다. 또한 강력한 악성코드 스캐너가 다양한 악성코드 변종을 탐지하여 해킹 복구까지 지원합니다.