서비스를 오픈하기 전, 직접 만든 보안 스캐너로 내 WordPress 서버를 점검해봤습니다.
결과는 꽤 흥미로웠습니다.
## 왜 직접 만들었나?
기존에 WPScan 같은 도구들이 있지만, 내 서버 구조(GCP + Nginx Proxy Manager + WordPress)에 맞게 커스터마이징하고 싶었습니다. 그래서 Python으로 이벤트 드리븐 방식의 보안 스캐너를 직접 구현했습니다.
구조는 단순합니다.
“`
Recon(정보 수집) → Scan(취약점 탐지) → Validate(검증)
“`
각 단계는 이벤트 버스로 통신하며 서로 독립적으로 동작합니다. 덕분에 새로운 체크 항목을 추가할 때 기존 코드를 건드리지 않아도 됩니다.
## 실제 스캔 결과
스캐너를 돌리자 몇 초 만에 결과가 나왔습니다.
“`
[RECON] WordPress version: 6.x.x
[SCAN] XML-RPC Enabled → MEDIUM
[SCAN] wp-cron.php Publicly Accessible → LOW
[VALIDATE] 2 confirmed
“`
총 11가지 항목을 체크했고, 취약점은 2개 발견됐습니다.
## 발견된 취약점과 조치
### 1. XML-RPC 활성화 (MEDIUM)
**XML-RPC가 뭔가요?**
오래된 WordPress 원격 제어 API입니다. 예전에는 스마트폰 앱이나 데스크톱 앱에서 블로그 글을 올릴 때 사용했지만, 2016년 REST API가 도입된 이후로는 사실상 쓸 일이 없습니다.
**왜 위험한가요?**
`system.multicall`이라는 기능을 이용하면 한 번의 HTTP 요청으로 수천 개의 비밀번호를 동시에 시도할 수 있습니다. 일반적인 로그인 시도 제한을 우회합니다.
**조치 방법**
WordPress 관리자 → 플러그인 → 새로 추가 → `Disable XML-RPC` 검색 후 설치.
코드 한 줄 안 건드리고 해결됩니다.
### 2. wp-cron.php 외부 접근 (LOW)
**wp-cron이 뭔가요?**
WordPress의 예약 작업 실행기입니다. 예약 발행, 자동 업데이트 체크, 백업 플러그인 등이 이걸 통해 동작합니다.
작동 방식이 독특한데, 누군가 사이트를 방문할 때마다 “지금 실행할 예약 작업이 있나?” 를 체크합니다.
**왜 위험한가요?**
`/wp-cron.php`를 외부에서 URL로 직접 반복 호출하면 서버에 불필요한 부하를 줄 수 있습니다.
**조치 방법**
Nginx Proxy Manager의 Custom Nginx Configuration에 아래를 추가했습니다.
“`nginx
location = /wp-cron.php {
deny all;
return 403;
}
“`
WordPress에 도달하기 전에 Nginx 레벨에서 차단하는 방식이라 가장 효율적입니다.
## 체크했지만 문제없었던 항목들
오히려 이 부분이 더 안심이 됐습니다.
| 체크 항목 | 결과 |
|—|—|
| 사용자 계정 노출 (REST API) | 안전 |
| 작성자 URL을 통한 사용자 열거 | 안전 |
| debug.log 파일 노출 | 안전 |
| wp-config.php 백업 파일 노출 | 안전 |
| 업로드 폴더 디렉토리 리스팅 | 안전 |
| .env 파일 노출 | 안전 |
| 로그인 페이지 무차별 대입 노출 | 안전 |
## 스캐너 코드는 오픈소스로
이번에 만든 스캐너는 WordPress 외에도 FastAPI, Next.js 서버도 각각 점검할 수 있도록 구성했습니다. GitHub에 오픈소스로 공개할 예정입니다.
관심 있으신 분들을 위해 기술 스택을 간단히 소개하면:
– **언어:** Python 3.12
– **HTTP 클라이언트:** httpx (비동기)
– **아키텍처:** 이벤트 드리븐 (모듈 간 직접 의존 없음)
– **보안:** 타겟 URL과 인증 정보는 `.env`에만 저장, 코드에 하드코딩 없음
## 마치며
보안은 한 번 설정하고 끝나는 게 아니라 지속적으로 점검해야 합니다.
서비스를 오픈하기 전에 이런 기본적인 점검을 직접 해보는 것만으로도 꽤 많은 걸 배울 수 있었습니다. 특히 XML-RPC처럼 “원래 있던 기능인데 이제 안 써도 되는 것들”을 정리하는 과정이 흥미로웠습니다.
다음에는 FastAPI와 Next.js 서버 점검 결과도 공유해보겠습니다.