保护 WordPress 网站免受 XML-RPC 攻击

XML-RPC 是一种远程过程调用,它使用 XML 对其调用进行编码,并使用 HTTP 作为传输机制。这是一个系统,允许您使用博客客户端在您的 WordPress 博客上发布帖子。这意味着,如果您想远程访问新内容并将其发布到您的网站,则需要启用 XML-RPC。XML-RPC 功能在早期的 WordPress 版本中默认处于禁用状态,主要是出于安全考虑。

然而,从 WordPress 3.5 开始,XML-RPC 功能默认开启,这导致了很多问题。

在实施更改后仅几个月,许多开发人员报告了针对 WordPress 网站的大规模 DOS 攻击,其中所有 WordPress 安装中包含的 XML-RPC 脚本是明显的漏洞。

所有这些攻击和由此导致的服务器崩溃都是由我认识的没有人使用的 XML-RPC 功能引起的。因此,唯一从这种 “强大 ”功能中受益的人是试图闯入您的网站或通过使服务器过载来使您的服务器崩溃的黑客,以及发布指向垃圾邮件网站的链接的垃圾邮件发送者,等等。

如何知道 XML-RPC 功能是否已禁用/启用?

确定您的 WordPress 网站是否容易受到 XML-RPC 攻击就像访问您的网站主页并在 URL 末尾添加“/xmlrpc.php”一样简单,例如:

  https://www.mysite.com/xmlrpc.php

如果看到 ‘Forbidden’ 错误,则没问题,除非有兴趣,否则无需阅读本文的其余部分。

  Forbidden
  You don't have permission to access /xmlrpc.php on this server.

如果您得到如下结果,则表明您启用了 XML-RPC 功能,并且可能会对您的 WordPress 网站进行攻击。

FXML-RPC server accepts POST requests only.

如何确定是否有人在我的 WordPress 网站上运行 XML-RPC 攻击?

最好的方式是服务器上的 ‘access.log‘ ,它记录了服务器处理的所有请求。如果您看到类似于以下内容的内容,则表示您已成为 XML-RPC 攻击的目标。

185.106.92.160 - - [18/Apr/2024:27:14:07 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:14:22 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:14:59 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:15:52 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:16:01 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:15:52 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
185.106.92.160 - - [18/Apr/2024:27:16:01 +0000] "POST /xmlrpc.php HTTP/1.0" 403 495 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

如何防止 XML-RPC 攻击?

使用插件

禁用 XML-RPC 插件 完全禁用 WordPress 网站上的 XML-RPC 功能。问题是网络爬虫程序仍然可以以您服务器上的“/xmlrpc.php”文件为目标并导致负载过大。因此,这种方法必须被认为是危险的,充其量只是一个部分解决方案。Jetpack 插件使用 Protect 模块,该模块还声称可以抵御针对 XML-RPC 功能的暴力攻击,实际上不建议用,这个插件很拖速度。

借用主题功能

添加过滤器是防止 XML-RPC 攻击的另一种方法,但不建议使用此方法,因为每次实现新主题时都需要这样做,并且在某些阶段您可能会忘记添加

  add_filter('xmlrpc_enabled', '__return_false');

添加到主题的 ‘functions.php’ 文件中。一些开发人员还报告说,这种方法并不总是有效,即使存在过滤器,服务器负载也可能保持较高水平。在这些情况下,服务器设置可能起着重要作用。

使用Apache .htaccess 文件

当我的网站托管在 Apache 服务器上时,这是我使用的方法,因为按如下方式修改 .htaccess 将拒绝对“xmlrpc.php”文件的访问。

<files xmlrpc.php>
    order allow,deny
    deny from all
  </files>
  
  RewriteRule ^xmlrpc.php$ "http://0.0.0.0/" [R=301,L]

我已经在不同的服务器上多次实施了这个解决方案,并且在所有情况下都有效。请注意, .(点)文件在 Unix/Linux 系统上默认隐藏,“.htaccess”文件的位置位于网站的根文件夹中,单并不是所有的套餐都有这个编辑权限。

NGINX 服务器块

非常流行的 NGINX 不附带“.htaccess”文件,它使用服务器块。可以通过将以下代码放在服务器块中来防止对 NGINX 服务器的 XML-RPC 攻击

  server {
    ...
     location /xmlrpc.php {
          deny all;
        }
    ...
    }

服务器块文件的位置取决于您的服务器设置,但在大多数情况下,它位于

etc/nginx/sites-available

使用 curl 命令测试 XML-RPC

打开终端(比如 iTerm2)并粘贴下面的代码,将“www.mysite.com”替换为你的网站名称。

$ curl -D -  "www.mysite.com/xmlrpc.php" -d '<methodCall><methodName>pingback.ping</methodName><params><param><value><string>www.josefzacek.cz/blog/rails-4-directory-structure/</string></value></param></params></methodCall>'

如果得到的回复与下面类似,那么没问题

  HTTP/1.1 301 Moved Permanently
  Server: nginx/1.10.1
  Date: Thu, 15 Sep 2016 21:12:15 GMT
  Content-Type: text/html
  Content-Length: 185
  Connection: keep-alive
  Location: https://www.mysite.com/xmlrpc.php
  Strict-Transport-Security: max-age=31536000
    
  <html>
  <head><title>301 Moved Permanently</title></head>
  <body bgcolor="white">
  <center><h1>301 Moved Permanently</h1></center>
  <hr><center>nginx/1.10.1</center>
  </body>
  </html>

但是,如果得到类似于下面的响应,则表示仍然启用了 XMl-RPC 功能

HTTP/1.1 200 OK
  Date: Thu, 15 Sep 2016 21:11:23 GMT
  Server: Apache
  X-Powered-By: PHP/5.5.38
  Connection: close
  X-SERVER: 2905
  Content-Length: 370
  Content-Type: text/xml; charset=UTF-8

  <?xml version="1.0" encoding="UTF-8"?>
  <methodResponse>
    <fault>
      <value>
        <struct>
          <member>
            <name>faultCode</name>
            <value><int>0</int></value>
          </member>
          <member>
            <name>faultString</name>
            <value><string></string></value>
          </member>
        </struct>
      </value>
    </fault>
  </methodResponse>

在测试 XML_RPC 功能时,需要注意输出中的 403 Forbidden 消息。403 Forbidden 消息表示 WordPress 网站中禁用了 XML-RPC。系统资源过载是您的 WordPress 网站在共享网络托管服务或虚拟专用服务器 (VPS) 上离线的最常见原因之一。本文中提到的防止 XML-RPC 攻击的最后两种方法(Apache 和 Nginx)将确保您的 WordPress 网站免受 XML-RPC 攻击。

如果网络托管公司或开发商告诉你直接删除“xmlrpc.php”,强烈建议忽略此类建议。虽然这听起来是个好主意,但它很危险,因为每当更新 WordPress 时,“xmlprc.php”文件都会重新生成。



评论

发表回复

必填项已用 * 标注