xmlrpc.php를 닫으면 공격이 줄어들까

xmlrpc.php를 닫으면 공격이 줄어들까

워드프레스에는 xmlrpc.php 라는 파일이 있습니다. 외부 프로그램이 글을 쓰거나 핑백을 보낼 때 쓰는 창구입니다. 요즘은 쓰는 사람이 거의 없고, 대신 비밀번호를 한 번에 수십 개씩 밀어 넣을 수 있다는 이유로 공격에만 쓰입니다. 그래서 닫으라는 글이 많습니다. 다만 닫으면 무엇이 어떻게 달라지는지를 숫자로 적어 둔 글은 찾지 못했습니다.

지난 10월 11일 12시 7분에 이 서버의 xmlrpc.php 를 403 으로 닫았습니다. 나흘 반이 지난 뒤 접속 기록을 세어 보니, 두드리는 IP 수는 하루 40~80곳으로 전과 비슷했습니다. 성공 응답은 하루 334건에서 0건이 되었습니다. 그리고 차단 전에 한 IP 가 열 번 넘게 두드리던 일이 96곳에서 0곳으로 사라졌습니다. 그 96곳이 전체 요청의 52.7%를 만들고 있었습니다.

무엇을 언제 닫았는가

워드프레스 설치 폴더의 .htaccess 맨 위에 세 줄을 넣었습니다. 아파치가 파일 이름만 보고 끊기 때문에 PHP 는 실행되지 않습니다. 워드프레스가 자기 규칙을 다시 쓸 때 지워지지 않도록 # BEGIN WordPress 보다 위에 두었습니다.

<Files "xmlrpc.php">
    Require all denied
</Files>

파일이 바뀐 시각은 2026년 10월 11일 12시 7분 31초입니다. 그래서 측정 창을 세 개로 나눴습니다. 차단 전은 보관된 로그 파일 하나가 그대로 10월 4일 0시부터 11일 0시까지 7일을 담고 있어서 그것을 썼습니다. 차단 직전은 11일 0시부터 12시 7분까지입니다. 차단 후는 12시 7분부터 측정을 돌린 10월 15일 18시 45분까지, 4일 6시간 38분입니다. 차단 후 창은 그 시점의 로그를 한 번 복사해 둔 사본에서 셌습니다. 1,279,369줄입니다. 로그는 계속 자라기 때문에 여러 번 세면 숫자가 조금씩 달라집니다.

성공 응답은 0이 되었습니다

이 서버의 접속 기록에는 어느 사이트로 온 요청인지 적는 칸이 없습니다. 여러 사이트가 한 파일에 섞여 쌓입니다. 그래서 응답 코드로 갈랐습니다. 403 은 내가 넣은 규칙이 끊은 것이니 내 사이트 것입니다. 404 는 그 파일이 없는 다른 사이트가 답한 것입니다. 차단 전에는 200 과 405 가 내 사이트 것이었습니다. 워드프레스의 이 파일은 POST 가 아닌 요청에 405 를 돌려주기 때문입니다.

기간 길이 내 사이트가 답한 요청 그중 200 하루 평균 요청
10/4 0시 ~ 10/11 0시 7일 2,571 2,339 367
10/11 0시 ~ 12시 7분 12.1시간 85 85 168
10/11 12시 7분 ~ 10/15 18시 45분 4.3일 316 0 74
xmlrpc.php 차단 전후 하루 평균을 비교한 막대그래프. 차단 전 요청 367건, 차단 전 성공 334건, 차단 후 요청 74건, 차단 후 성공 0건
차단 후에도 요청은 하루 74건씩 들어오지만 성공은 0건입니다.

200 이 12시 7분을 넘기면서 정확히 끊겼습니다. 그다음 나흘 반 동안 한 건도 없습니다. 이것은 규칙이 듣는다는 확인이자, 차단 전 2,339건의 200 이 다른 사이트가 아니라 내 사이트가 답한 것이었다는 증거이기도 합니다. 응답 크기도 달라졌습니다. 200 응답은 평균 379바이트였고, 403 응답은 199바이트입니다.

요청은 사라지지 않았습니다

차단했으니 안 올 것이라고 기대했는데 그렇지 않았습니다. 날마다 몇 곳의 IP 가 두드렸는지 세면 이렇습니다. 차단 경계인 11일은 두 상태가 섞여 있어 뺐습니다.

차단 전 두드린 IP 차단 후 두드린 IP
10월 4일 81 10월 12일 82
10월 5일 47 10월 13일 33
10월 6일 45 10월 14일 31
10월 7일 132 10월 15일 49
10월 8일 119
10월 9일 582
10월 10일 41

차단 전은 41곳에서 582곳까지 흔들립니다. 차단 후는 31곳에서 82곳입니다. 두 구간이 겹칩니다. 봇이 403 을 보고 명단에서 이 주소를 지운다는 증거는 없습니다. 차단 후에 두드린 202곳 중 차단 전에도 왔던 IP 는 20곳뿐이었습니다. 같은 봇이 다시 오는 것이 아니라, 매번 다른 IP 가 와서 한 번씩 두드립니다.

대신 한 IP 가 두드리는 횟수가 줄었습니다

달라진 것은 요청을 보낸 IP 의 수가 아니라 한 IP 가 보낸 횟수입니다.

한 IP 의 시도 횟수 차단 전 (927곳) 차단 후 (202곳)
1회 60.2% 61.4%
2회 21.5% 27.2%
3회 5.6% 7.9%
4~9회 2.4% 3.5%
10회 이상 10.4% (96곳) 0% (0곳)

한 번만 두드리고 가는 비율은 양쪽이 같습니다. 60.2%와 61.4%입니다. 한 번 와서 한 번 거절당한 IP 는 애초에 두 번째 요청을 보낼 계획이 없었던 것입니다. 바뀐 칸은 맨 아래입니다. 차단 전에는 한 IP 가 열 번 이상 두드린 경우가 96곳 있었고 가장 많이 두드린 IP 는 88번 왔습니다. 차단 후 가장 많이 두드린 IP 는 6번입니다. IP 하나당 평균은 2.77회에서 1.56회로 내려갔습니다.

요청의 절반을 만들던 집단이 없어졌습니다

그 96곳이 보낸 요청은 1,355건입니다. 차단 전 전체 2,571건의 52.7%입니다. 전체 IP 의 10.4%가 요청의 절반을 만들고 있었습니다. 그리고 그 1,355건 중 1,300건이 POST 였고 전부 200 을 받았습니다. 한 번 보내서 200 이 돌아오면 다음 요청을 보내고, 그래서 12번·30번·88번이 됩니다. 비밀번호를 밀어 넣는 공격은 대화가 이어져야 성립합니다. 403 은 그 대화를 첫 줄에서 끊습니다. 차단 후 가장 부지런한 7곳이 보낸 요청을 합쳐도 34건, 전체의 10.8%입니다.

다른 문으로 옮겨갔는지 봤습니다

한 문을 닫으면 옆 문으로 간다는 말이 있습니다. 로그인 문인 wp-login.php 에 POST 가 들어와 200 을 받은 건수를 날마다 세어 비교했습니다.

차단 전 로그인 시도 차단 후 로그인 시도
10월 4일 192 10월 12일 270
10월 5일 348 10월 13일 160
10월 6일 98 10월 14일 338
10월 7일 86
10월 8일 219
10월 9일 243
10월 10일 107

차단 전 7일 평균은 185건이고 차단 후 3일 평균은 256건입니다. 늘었습니다. 그런데 차단 전 하루 값이 86건에서 348건까지 흔들렸습니다. 256건은 그 안에 들어가는 숫자입니다. 그러니 이 표로는 옮겨왔다고 말할 수 없습니다. 거절당한 202곳이 같은 기간에 이 서버에서 무엇을 더 긁었는지도 봤습니다. 절반인 101곳이 다른 경로도 요청했는데, 101곳의 중간값은 6건이고 상위 6곳이 그 요청의 81.8%를 차지했습니다. 그 상위 IP 가 긁은 것은 /this_is_a_new_hello_world.php, /wp-content/admin.php 같은 이름들입니다. 이미 설치된 뒷문을 찾는 스캔이고, 차단 때문에 시작한 일이 아닙니다.

닫으면서 잃은 것

차단 후 403 을 받은 요청 316건 중 313건은 브라우저를 자칭했습니다. 이 창구는 브라우저가 쓰는 곳이 아니니 전부 거짓입니다. 나머지 3건은 워드프레스 쪽 클라이언트였습니다. 핑백을 보내는 라이브러리가 2건, WordPress.com 이 1건입니다. 즉 닫으면서 잃은 것은 밖에서 들어오는 핑백과 WordPress.com 연동입니다. 이 사이트는 둘 다 쓰지 않습니다. 쓰고 있다면 이 세 줄을 넣기 전에 먼저 그것을 확인해야 합니다. 같은 로그에서 어디서 왔다는 기록이 거짓이었던 요청을 세어 본 적이 있는데, 그때도 자칭을 믿으면 안 된다는 결론이 같았습니다.

이 측정이 말하지 못하는 것

세 가지가 남습니다. 첫째, 하루 요청이 367건에서 74건으로 내려갔지만 이것을 차단의 효과라고 말할 수 없습니다. 차단 전후에 두드린 IP 의 대역 구성이 달라졌고 겹치는 IP 는 20곳뿐입니다. 캠페인 자체가 바뀌었을 가능성을 이 로그로는 가릴 수 없습니다. 둘째, 10월 9일 하루에 582곳이 몰린 날이 평균을 끌어올렸습니다. 그 날을 빼면 차단 전 하루 평균은 283건입니다. 셋째, 로그에 사이트 구분 칸이 없어서 404 와 301 은 다른 사이트 몫으로 넘겼습니다. 응답 코드로 가른 것이라 완벽한 분리는 아닙니다. 워드프레스가 밖으로 보내는 요청을 셀 때도 같은 한계를 안고 셌습니다.

다시 잴 것

11월 1일에 같은 방식으로 다시 세겠습니다. 볼 것은 세 가지입니다. 10회 이상 두드리는 IP 가 계속 0곳인지, 두드리는 IP 수가 차단 전 범위를 벗어나는지, wp-login.php 로그인 시도가 차단 전 변동폭을 넘어서는지입니다. 세 번째가 넘어가면 그때는 옮겨왔다고 말할 수 있습니다.

자주 묻는 것

403 과 404 를 왜 따로 셌습니까

이 서버의 접속 기록은 여러 사이트가 한 파일에 섞이고, 어느 사이트로 온 요청인지 적는 칸이 없습니다. 403 은 내가 넣은 규칙만 만들 수 있으니 내 사이트 것이고, 404 는 그 파일이 아예 없는 다른 사이트가 답한 것입니다. 그래서 내 사이트 숫자는 403 만 셌습니다.

차단 전 숫자에 405 를 왜 포함했습니까

워드프레스의 이 파일은 POST 가 아닌 요청에 405 를 돌려줍니다. 그러니 차단 전 내 사이트에 닿은 요청은 200 과 405 를 합한 2,571건입니다. 200 만 세면 2,339건이 되는데, 차단 후와 비교할 때는 닿은 요청 전체를 봐야 해서 둘을 합쳤습니다. 405 가 차단 후에 0건이 된 것도 그 둘이 같은 파일의 응답이었다는 확인이 됩니다.

차단하지 말고 파일을 지우면 안 됩니까

지워도 코어를 업데이트하면 다시 생깁니다. 그리고 403 은 아파치가 파일 이름만 보고 끊는 것이라 PHP 가 실행되지 않습니다. 지운 것과 서버가 하는 일의 양이 같습니다. 파일을 남겨 두면 나중에 핑백이나 외부 연동이 필요해질 때 세 줄만 지우면 됩니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다