PHP 웹쉘 탐지 방법, 의심 파일 점검과 대처 순서

핵심 요약
  • 웹쉘은 서버에 심어 둔 PHP 파일로 원격에서 명령을 실행하게 하는 도구이며, 주로 업로드 폴더와 최근 수정 파일에서 발견됩니다.
  • find로 최근 수정된 PHP 파일을, grep으로 의심 함수 사용을 찾되 정상 코드도 걸리므로 눈으로 판단해야 합니다.
  • 발견하면 지우기 전에 복사본과 로그를 보존하고, 침입 경로를 막은 뒤 복구해야 재감염을 줄입니다.

웹쉘(webshell)은 해킹된 서버에 몰래 올려 둔 PHP 파일로, 공격자가 브라우저로 그 파일 주소를 열어 서버에 명령을 내리거나 파일을 마음대로 다루게 해 주는 도구입니다. 눈에 보이는 증상이 없어도 이런 파일이 남아 있으면 사이트가 계속 통제되고 있을 수 있습니다.

이 글은 의심 파일을 직접 찾는 방법과 발견했을 때의 순서를 다룹니다. 서버 안에서만 확인할 수 있는 내용이며, 외부 주소 검사만으로는 웹쉘 유무를 확정할 수 없다는 점을 먼저 기억하세요.

웹쉘이 자주 생기는 곳

위치이유
업로드 폴더(uploads 등)파일 업로드 취약점으로 PHP 파일이 올라가기 쉬움
플러그인·테마 폴더취약한 구성요소를 통해 파일이 추가됨
웹 루트와 하위 폴더정상 파일 사이에 이름을 비슷하게 숨김
임시·캐시 폴더눈여겨보지 않는 폴더라 오래 남음

업로드된 파일이 웹에서 접근 가능한 폴더에 PHP 형태로 남아 있으면 주소를 직접 열어 실행될 수 있습니다. 그래서 업로드 폴더에는 이미지나 문서만 있어야 정상이고 .php 파일이 있다면 먼저 의심해 볼 만합니다.

1단계 최근에 바뀐 PHP 파일 찾기

해킹 의심 시점 이후 수정된 PHP 파일을 시간순으로 찾아 봅니다. 사이트 루트에서 실행하세요.

# 최근 7일 안에 수정된 PHP 파일
find . -type f -name "*.php" -mtime -7 -ls

# 업로드 폴더 안의 PHP 파일 (이미지 폴더에 있으면 이상 신호)
find wp-content/uploads -type f -name "*.php" -ls

내가 직접 수정하거나 업데이트한 기록이 없는데 바뀐 파일이 있다면 그 파일을 열어 보세요. 파일 수정 시각은 조작될 수 있으므로 참고 자료로만 쓰고, 오래전 시각이라고 안심하지 마세요.

내 사이트의 HTTPS·인증서·보안 헤더를 바로 확인할 수 있습니다.

무료 보안 검사 시작

2단계 의심 함수 문자열 검색

웹쉘에는 문자열을 해독해 실행하거나 시스템 명령을 호출하는 함수가 자주 쓰입니다. 아래 검색은 후보를 좁히는 용도입니다.

grep -rEl "(eval|assert|shell_exec|passthru|system|exec)\s*\(" --include="*.php" .
grep -rEl "base64_decode|gzinflate|str_rot13" --include="*.php" .

정상 플러그인과 프레임워크도 이런 함수를 쓰는 경우가 있어서 결과가 많이 나올 수 있습니다. 그럴 때는 파일 경로가 어느 플러그인 소속인지, 한 줄에 매우 긴 난독화 문자열이 있는지, 수정 시각이 다른 파일과 다른지를 함께 보세요. 문자열 검색은 코드를 가리면 놓칠 수 있으니 이 결과만으로 안전하다고 판단하지 마세요.

3단계 코어·플러그인 파일 대조

워드프레스라면 코어 파일과 플러그인을 원본과 비교하는 것이 가장 확실합니다. 플러그인은 wordpress.org 저장소에서 같은 버전을 내려받아 폴더를 비교하거나 깨끗한 파일로 덮어쓰는 방식이 있고, 자세한 순서는 워드프레스 해킹 복구 순서 글에서 다룹니다. 이미 손상된 서버의 도구나 명령 결과도 믿기 어려울 수 있으니, 가능하면 별도 환경에서 대조하세요.

로그에서 단서 찾기

웹쉘은 보통 한 번 심은 뒤 같은 주소로 반복 접속합니다. 접근 로그에서 평소 없던 PHP 파일 주소로 POST 요청이 이어지거나, 업로드 폴더의 PHP 파일에 요청이 들어온 기록이 있으면 의심 단서가 됩니다. 접근 로그 보는 방법은 서버 접근 로그 확인 글을 참고하세요. 로그가 이미 지워졌거나 회전되어 사라졌을 수도 있으니 보관 기간도 함께 점검하세요.

발견했을 때 대처 순서

  1. 파일을 바로 지우지 말고 복사본을 안전한 곳에 보관합니다. 어떻게 들어왔는지 분석하는 증거가 됩니다.
  2. 웹 서버 접근 로그에서 해당 파일 주소로 들어온 요청과 시각을 기록해 둡니다.
  3. 사이트를 점검 모드로 전환하거나 접근을 제한해 추가 피해를 막습니다.
  4. 서버 계정, 관리자, FTP, DB 비밀번호를 모두 바꿉니다.
  5. 침입 경로로 보이는 플러그인과 테마, PHP를 업데이트하거나 제거합니다.
  6. 깨끗한 백업이나 원본 파일로 복구하고, 다시 같은 점검을 반복합니다.

전체 대응 흐름은 악성코드 감염 의심 시 대처 글에 정리되어 있습니다.

재발을 줄이는 설정

업로드 폴더에서 PHP가 실행되지 않도록 서버 설정을 두고, 파일 업로드는 서버에서 크기·유형·이름을 검증하세요. 브라우저가 보낸 MIME 유형과 파일명은 조작될 수 있으니 그대로 믿으면 안 됩니다. php.ini에서 불필요한 함수를 막는 방법은 PHP 서버 보안 설정 글에서 다룹니다. disable_functions는 우회될 수 있어 충분한 보안 수단으로 보면 안 된다는 점이 매뉴얼에 명시되어 있으니 보조 수단으로만 생각하세요.

웹사이트 기본 보안 검사HTTPS·리디렉션·인증서·보안 헤더·서버 정보 노출 10개 항목을 무료로 확인할 수 있습니다.

무료 보안 검사 시작

자주 묻는 질문

grep으로 아무것도 안 나오면 안전한가요?

안전하다고 확정할 수 없습니다. 웹쉘은 코드를 가리거나 이름을 정상 파일처럼 꾸밀 수 있어서 문자열 검색으로 놓치는 경우가 있습니다. 수정 시각, 파일 위치, 코어 파일 비교를 함께 보세요.

정상 플러그인도 eval이나 base64_decode를 쓰나요?

쓰는 경우가 있습니다. 그래서 검색에 걸렸다고 곧 악성이라고 보지 말고, 그 파일이 어느 플러그인 소속인지와 위치, 수정 시각을 함께 확인해야 합니다.

외부 검사 도구로 웹쉘을 찾을 수 있나요?

공개 검사로는 서버 안의 파일을 볼 수 없어서 웹쉘 존재를 확정할 수 없습니다. 서버 안에서 파일을 직접 점검하거나 서버 쪽 검사 도구를 쓰세요.

웹쉘을 지우기만 하면 끝인가요?

아닙니다. 침입 경로(취약한 플러그인, 탈취된 계정 등)가 남아 있으면 다시 심어질 수 있습니다. 비밀번호 교체와 업데이트까지 함께 해야 합니다.

확인한 자료

기술 정보는 2026-10-24에 위 자료로 확인했습니다. 소프트웨어 버전·기본값·서비스 정책은 바뀔 수 있으므로 적용 전 각 문서의 최신 내용을 확인하세요. 이 글은 일반 정보이며 특정 서비스 가입을 권하지 않습니다.

Next
PHP 보안

PHP 서버 보안 설정 php.ini 필수 항목 정리

expose_php, display_errors, allow_url_include, disable_functions, open_basedir, 세션 쿠키 옵션 등 php.ini 보안 설정의 기본값과 권장 값, 적용 확인 방법을 정리했습니다.

가이드 보기 →
워드프레스 보안

워드프레스 해킹 복구 순서, 격리부터 재발 방지까지

워드프레스가 해킹당했을 때 복구하는 순서를 정리했습니다. 격리와 백업, 비밀번호·보안 키 교체, 코어와 플러그인 재설치, 재발 방지 설정까지 단계별로 설명합니다.

가이드 보기 →
웹사이트 보안

웹사이트 악성코드 감염 대처, 초기 대응과 증거 보존

웹사이트 악성코드 감염이 의심될 때 먼저 할 일을 순서대로 정리했습니다. 격리, 증거 보존, 비밀번호 교체, 정리와 재발 방지, Search Console 검토 요청까지 다룹니다.

가이드 보기 →
PHP 보안

PHP 버전 확인 방법, 명령어와 워드프레스 화면 점검

서버 명령어 php -v, phpinfo 화면, 워드프레스 사이트 상태, 호스팅 패널에서 PHP 버전을 확인하는 방법과 CLI·웹 버전이 다를 수 있는 이유를 정리했습니다.

가이드 보기 →
PHP 보안

PHP 업데이트 방법, 호스팅 패널과 리눅스 서버 순서

PHP 버전을 올리는 순서를 호스팅 패널과 Ubuntu·Debian 서버로 나눠 설명하고, 업데이트 전 호환성 점검과 실패했을 때 되돌리는 방법까지 정리했습니다.

가이드 보기 →