웹페이지 운영/워드프레스

워드프레스 API 실행을 위해서 xmlrpc 활성화 시키는 방법

공무원 봉급 2022. 5. 20. 15:03

네이버 블로그나 티스토리 블로그와는 달리, 워드프레스는 각종 API들을 제공합니다. 워드프레스의 API를 통해서 웹페이지나 블로그를 자동화시킬 수 있습니다. 이런 API는 상당히 강력한 기능이 아닐 수 없습니다만, 분명히 단점도 존재합니다. 특히 xmlrpc는 보안에 몹시 취약합니다.

 

워드프레스 xmlrpc 취약점

그 이유는 해당 API를 이용해서 brute-force 방식으로 연속으로 암호를 대입하여 관리자의 암호를 알아낼 수 있기 때문입니다. 특히 이 취약점만 전문적으로 공격하는 로봇이 있을 정도라고 합니다.

아무튼 이런 이유로 xmlrpc 관련된 내용을 구글에서 찾으면 이런 취약점을 보완시킬 수 있는 방법에 대한 기사들이 주로 검색이 됩니다. 오히려 본래의 목적대로 xmlrpc를 사용하려는 사용자들이 원하는 정보를 얻기 힘든 상황이 벌어졌습니다.

본 페이지에서는 워드프레스의 xmlrpc를 사용할 수 있도록 활성화 시키는 방법에 대해서 설명드리겠습니다.

 

xmlrpc 활성화 시키는 방법

워드프레스의 xmlrpc를 사용하려면 제대로 동작하지 않는 경우가 많이 있습니다. 특히 HTTP 403 forbidden 응답이 오는 경우가 있는데, 이는 여러가지 원인에 의해서 발생할 수 있습니다.

xmlrpc를 비활성화시키는 방법은 여러가지가 있습니다. 대표적으로 아래 3가지 정도의 방법으로 xmlrpc를 비활성화 시킬 수 있습니다. 다시 말하면, 아래 3가지 항목들을 살펴보면 xmlrpc를 다시 활성화 시킬 수 있다는 이야기입니다.

  • 1단계 : xmlrpc를 비활성화시키는 플러그인을 살펴봅니다.
  • 2단계 : xmlrpc를 비활성화시키는 워드프레스 설정을 살펴봅니다.
  • 3단계 : 웹 서비스에서 xmlrpc를 비활성화 시켰는지 살펴봅니다.

 

1단계. xmlrpc를 비활성화시키는 플러그인을 살펴봅니다.

가장 먼저 손쉽게 확인할 수 있는 방법입니다. 필자의 경우는 'Disable XML-RPC-API' 라는 플러그인을 사용하여 xmlrpc를 비활성화시켰습니다. XML-RPC를 비활성화 시키는 플러그인을 굉장히 많기 때문에 이 기능이 있는 플러그인을 사용중인 것은 아닌지 확인해보시기 바랍니다.

 

2단계. xmlrpc를 비활성화 시키는 워드프레스 설정을 살펴봅니다.

쉘로 워드프레스 디렉토리로 이동하여 아래의 명령으로 xmlrpc_enable 키워드를 살펴봅니다.

cd /var/www/wordpress
grep -r 'xmlrpc_enabled' *

 

위의 명령은 /var/www/wordress 라는 디렉토리에서 xmlrpc_enabled 라는 키워드의 문자열을 하위 디렉토리까지 모두 뒤져서 찾아내는 명령입니다.

그 결과를 살펴보면, 아래와 같이 add_filter( 'xmlrpc_enable', '__return_false' ); 라는 키워드가 검색되었지만 해당 부분은 주석 처리가 되어 있습니다.

/var/www/wordpress# grep -r 'xmlrpc_enabled' *
wp-includes/class-wp-xmlrpc-server.php: * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::set_is_enabled().
wp-includes/class-wp-xmlrpc-server.php:  * option was deprecated in 3.5.0. Use the {@see 'xmlrpc_enabled'} hook instead.
wp-includes/class-wp-xmlrpc-server.php:  *     add_filter( 'xmlrpc_enabled', '__return_false' );
wp-includes/class-wp-xmlrpc-server.php: $this->is_enabled = apply_filters( 'xmlrpc_enabled', $is_enabled );

참고로 해당 구문은 워드프레스 3.5 버전부터 주석처리 되어 있기 때문에 최신 워드프레스 버전을 사용하시는 분들께는 해당되지 않는 내용입니다.

 

3단계. 웹서비스 권한 설정을 살펴봅니다.

리노드를 포함한 웹호스팅 서비스에서 기본적으로 워드프레스의 xmlrpc 기능을 막아두었습니다. 이는 기본적으로 고객들이 xmlrpc 해킹으로부터 지키기 위한 조치이긴 하지만, xmlrpc를 막상 사용하려면 설정을 변경해줘야 되기 때문에 다소 불편할 수 있습니다.

 

아파치 웹서버의 설정 파일을 살펴봅니다. 설정 파일은 설정을 어떻게 했느냐에 따라서 다를 수 있습니다.

아래 경로의 파일들을 우선적으로 살펴보시기 바랍니다.

  • /etc/apache2/apache2.conf
  • /etc/apache2/sites-available/000-default.conf
  • /etc/apache2/sites-available/default-ssl.conf
  • /etc/apache2/sites-available/wordpress-le-ssl.conf

 

만약 grep 명령을 통해서 검색을 하시고 싶으시다면, 아래의 명령으로 설정 부분을 좀 더 손쉽게 찾을 수 있겠습니다.

$ cd /etc/apache2
$ grep -r 'xmlrpc.php' *

 

설정 파일에 아래와 같이 xmlrpc.php 파일에 대한 설정이 있는지 살펴보시면 됩니다.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.mesti.xyz
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/wordpress/
    ErrorLog /var/log/apache2/wordpress/error.log
    CustomLog /var/log/apache2/wordpress/access.log combined
    <files xmlrpc.php>
    order allow,deny
    deny from all
    </files>

SSLCertificateFile /etc/letsencrypt/live/www.mesti.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mesti.xyz/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

 

위의 설정 파일을 자세히 살펴보면 아래와 같은 설정이 있습니다.

    <files xmlrpc.php>
    order allow,deny
    deny from all
    </files>

즉, xmlrpc.php 파일을 사용하지 못하도록 권한을 제거하는 설정입니다. 이로 인해서 xmlrpc API를 호출하면 HTTP 403 forbidden 응답이 왔던 것입니다.

 

아래와 같이 xmlrpc.php 파일에 대한 권한 설정 부분을 주석처리 하시면 됩니다.

기존 <IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.mesti.xyz
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/wordpress/
    ErrorLog /var/log/apache2/wordpress/error.log
    CustomLog /var/log/apache2/wordpress/access.log combined
    <files xmlrpc.php>
    order allow,deny
    deny from all
    </files>

SSLCertificateFile /etc/letsencrypt/live/www.mesti.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mesti.xyz/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
변경 <IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.mesti.xyz
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/wordpress/
    ErrorLog /var/log/apache2/wordpress/error.log
    CustomLog /var/log/apache2/wordpress/access.log combined
#    <files xmlrpc.php>
#    order allow,deny
#    deny from all
#    </files>

SSLCertificateFile /etc/letsencrypt/live/www.mesti.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mesti.xyz/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

 

설정 파일을 변경했다면 반드시 아파치 웹서비스를 재시작해줘야 합니다.

$ sudo service apache2 restart

 

4단계. xmlrpc 동작 테스트

설정 파일 변경 및 서비스 재시작 이후에 기존에 403에러로 제대로 수행되지 않았던 스크립트를 수행해봤더니 아래와 같이 정상적으로 잘 실행이 되네요.

$ ./getPosts.py
Posts : ['330', '323', '318', '312', '307', '302', '297', '292', '290', '286']

 

아주 간단한 xmlrpc API 파이썬 스크립트

아래는 워드프레스 웹페이지의 포스트 목록을 가져오는 아주 간단한 API 스크립트입니다.

#!/usr/bin/python3

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import posts

def getPosts(url, id, pw):
  url = url + "/xmlrpc.php"
#  print("id :", id)
#  print("pw :", pw)
#  print("url :", url)

  client = Client(url, id, pw)

  ids = []

  postList = client.call(posts.GetPosts())
  for post in postList:
#    print("ID :", post.id)
    ids.append(post.id)

  return ids

 

참고할만한 페이지

https://www.intelliwolf.com/enable-xml-rpc-wordpress/

 

How To Enable XML-RPC On WordPress

I needed to use XML-RPC on one of my sites to verify that I owned the site. Normally that's not a problem with WordPress sites, because XML-RPC is enabled by default. However, I always turn it off and block access to it through iThemes Security. To enable

www.intelliwolf.com

 

제 웹페이지에는 워드프레스 API에 대한 더 많은 정보를 제공하고 있습니다. 참고 부탁드립니다.

이상입니다.