최근 웹사이트 방문자를 가짜 성인 데이트 사이트로 강제 연결하는 새로운 유형의 리디렉션 악성코드가 등장했습니다. 이 악성코드 캠페인은 감염된 웹사이트에 수천 개의 가짜 페이지를 생성하고, 이를 Google 검색에 색인시켜 트래픽을 가로채는 방식으로 작동합니다.
site:example.com 형식으로 자신의 도메인을 검색해 보면, 본인이 만든 적 없는 페이지들이 검색 결과에 나타나는 것을 확인할 수 있습니다.
다양한 스팸 카테고리로 확산 중
이 캠페인은 성인 데이트 사이트뿐만 아니라 에세이, 의약품(pharma), 대출, 미디어, 악성 다운로드 스팸 사이트 등 다양한 분야의 가짜 페이지와 리디렉션을 생성하는 것으로 알려져 있습니다.
관련 글 – WordPress 리디렉션 해킹
Google에 색인된 링크를 클릭하면 아래 이미지처럼 선정적인 콘텐츠와 메시지가 담긴 사이트로 강제 이동됩니다.
내 웹사이트가 감염되었는지 확인하는 방법
- 직접 생성하지 않은 페이지가 Google 검색 결과에 대량으로 노출됩니다.
- Google에서 자신의 웹사이트 링크를 클릭하면 성인·도박·데이트 사이트로 리디렉션됩니다.
- 본인이 인지하지 못한 새로운 페이지가 웹사이트에 추가됩니다.
- 관리자 대시보드에 알 수 없는 관리자 계정이 생성됩니다.
- 웹사이트 접속 속도가 눈에 띄게 느려집니다.
- Google Search Console에서 보안 경고 메시지를 수신했습니다.
Drupal 사이트에서 리디렉션 해킹을 찾는 방법
저희는 Drupal 7 기반 사이트에서 발생한 이 악성코드 캠페인을 조사했으며, 해커들이 정교한 난독화 기법으로 악성코드를 은닉하여 탐지를 어렵게 만든 사실을 확인했습니다.
Astra의 악성코드 스캐너(Malware Scanner)로 사이트를 검사한 결과, includes/template.inc 경로에서 수상한 파일이 발견되었습니다.
추가 조사 결과, 해당 template.inc 파일은 'Drupal Registry'에 등록되어 있어 모든 요청 시마다 자동으로 로드되는 구조였습니다. 이 설정값은 데이터베이스에 저장되어 있었습니다.
난독화된 코드 분석
다음 단계로 플래그 처리된 파일 내부의 코드를 디코딩했습니다. 특히 getMimeDescription() 함수가 핵심이었습니다.
public function getMimeDescription($documentDir) {
$indicies=array(8, 5, 0, 1, 9, 4, 6, 7, 3, 2);
$mimeMarkers=array('themes', 'Porto', 'loader1', 'light_rounded', 'prettyPhoto', 'all', 'images', 'prettyPhoto', 'sites', 'vendor');
$mimeType='gif';
$selecteds=array();
foreach($indicies as $index) {
$selected=$mimeMarkers[$index];
$selecteds[]=$selected;
}
array_unshift($selecteds, $documentDir);
$cachePath=join('/', $selecteds);
return $cachePath.'.'.$mimeType;
}
}
위 코드를 실행하면 또 다른 악성 파일의 실제 경로가 출력됩니다.
sites/all/themes/Porto/vendor/prettyPhoto/images/prettyPhoto/light_rounded/loader1.gif
PHP의 gzinflate() 함수로 압축된 문자열을 해제한 후, base64로 인코딩된 데이터가 추가로 발견되었습니다.
여러 겹의 난독화를 벗겨낸 끝에, 아래 스니펫과 같이 실제 악성코드의 정체가 드러났습니다.
$v266=array('essay','pharm','dating','loan','media','download');
if(isset($this->v254['theme'])){
$this->v12->t4("page theme: '{
0
}
'",$this->v254['theme']);
$v267=strtolower($this->v254['theme']);
foreach($v266 as$v80){
if(strpos($v267,$v80)!==false)return$v80;
}
}
else{
$this->v12->t4("page has NO theme. old dor");
}
return'default';
}
function t170($v268,$v148){
$v269=$this->v255->t147($v268['exit']['url'],$this->v254,$v148);
return array('name'=>$v268['name'],'exit'=>$v268['exit']['type'],'url'=>$v269[00],'extparams'=>$v269[01]);
}
코드를 살펴보면 'essay', 'pharm', 'dating', 'loan', 'media', 'download'라는 키워드 배열이 포함되어 있습니다. 이는 해커가 페이지 테마 값에 따라 서로 다른 스팸 카테고리로 방문자를 리디렉션하도록 설계했음을 보여주는 대목입니다.
가짜 성인 데이트 사이트 리디렉션을 차단하는 방법
리디렉션을 완전히 제거하려면 웹사이트의 모든 파일과 데이터베이스를 대상으로 악성코드 검사를 수행해야 합니다. 이번 해킹 분석에서 확인했듯이, 해커들은 여러 단계의 난독화와 코드 은닉 기법으로 리디렉션 코드를 매우 교묘하게 숨깁니다.
직접 악성코드를 제거하는 방법이 필요하다면, WordPress 악성코드 완전 제거 가이드를 참고하세요.
데이트 사이트 리디렉션 예방을 위한 보안 권장 사항
- 복구 상황에 대비해 웹사이트를 미리 백업해 둡니다.
- CMS, 플러그인, 테마를 항상 최신 버전으로 유지합니다.
- 해킹의 원인을 파악하고 해당 취약점을 패치합니다.
- 견고한 방화벽(WAF)으로 웹사이트를 보호합니다.
- 파일이나 폴더에 777 권한을 부여하지 않습니다. 폴더는 755, 파일은 644로 설정합니다.
- 백엔드에 알 수 없는 관리자 계정이 추가되었는지 주기적으로 확인합니다.
- public_html 폴더 내 백업 파일(.zip, .sql, .tar 등)을 삭제합니다.