내 WordPress 서버를 직접 해킹해봤다 — 셀프 보안 감사 후기

서비스를 오픈하기 전, 직접 만든 보안 스캐너로 내 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 서버 점검 결과도 공유해보겠습니다.