WordPress는 전 세계 웹사이트의 40% 이상을 차지하는 만큼 공격자들의 주요 타깃입니다. 자동화 봇은 WordPress를 사용하는 서버를 끊임없이 스캔하고, 알려진 취약점을 찾아 공격을 시도합니다. 이 모든 시도는 Nginx 또는 Apache 액세스 로그에 기록됩니다.
`` GET /wp-login.php HTTP/1.1 GET /wp-admin/ HTTP/1.1 GET /wp-content/ HTTP/1.1 GET /xmlrpc.php HTTP/1.1 `
이 경로에 대한 요청이 갑자기 증가했다면, 봇이 WordPress 사이트임을 확인하고 공격 준비에 들어간 것입니다.
` 203.0.113.42 - - [10/May/2024:03:21:05 +0000] "POST /wp-login.php HTTP/1.1" 200 4823 203.0.113.42 - - [10/May/2024:03:21:06 +0000] "POST /wp-login.php HTTP/1.1" 200 4823 `
주의: 응답이 200이어도 로그인 실패입니다. WordPress는 로그인 실패 시에도 200을 반환하므로 응답 크기로 판단해야 합니다.
탐지:
`bash grep 'POST /wp-login.php' /var/log/nginx/access.log \ | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 `
` 198.51.100.7 - - [10/May/2024:04:10:01 +0000] "POST /xmlrpc.php HTTP/1.1" 200 403 198.51.100.7 - - [10/May/2024:04:10:02 +0000] "POST /xmlrpc.php HTTP/1.1" 200 403 `
XML-RPC의 system.multicall 메서드를 사용하면 단 1번의 HTTP 요청으로 수백 번의 로그인 시도가 가능합니다.
` GET /wp-content/plugins/revslider/temp/update_extract/revslider/revslider.php GET /wp-content/plugins/contact-form-7/ GET /wp-content/plugins/elementor/ `
` GET /?author=1 HTTP/1.1 GET /?author=2 HTTP/1.1 GET /?author=3 HTTP/1.1 `
WordPress의 ?author=숫자 파라미터는 유효한 사용자 페이지로 리다이렉트됩니다.
`nginx location = /wp-login.php { allow 203.0.113.10; deny all; fastcgi_pass unix:/run/php/php8.2-fpm.sock; include fastcgi_params; } `
`nginx location = /xmlrpc.php { deny all; return 403; } `
`nginx location ~ /wp-content/.\.php$ { deny all; return 403; } `
`nginx if ($query_string ~* "author=[0-9]+") { return 403; } `
| 항목 | 방법 |
|---|---|
| ------ | ------ |
| 관리자 계정명 변경 | admin 대신 예측 불가 사용자명 사용 |
| 이중 인증(2FA) 적용 | Google Authenticator 플러그인 |
| 로그인 시도 횟수 제한 | Limit Login Attempts 플러그인 |
| xmlrpc.php 비활성화 | Jetpack 등 필요 시 IP 제한 |
| 파일 편집기 비활성화 | define('DISALLOW_FILE_EDIT', true);` |
| 플러그인 최신화 | 취약한 구버전 플러그인이 주요 침투 경로 |
WordPress 공격은 대부분 자동화 봇에 의해 반복적으로 발생합니다. 핵심 방어 경로는 wp-login.php 접근 제한, xmlrpc.php 차단, 플러그인 PHP 실행 차단 세 가지입니다.