WordPress通过内置的API调用XML-RPC接口,方便用户通过客户端来管理站点,比如通过邮件发布日志、与其他博客平台通信等。正是如此好用的功能,往往被黑客用来绕过暴力破解限制,尝试猜测用户账号、扫描主机端口等。
风险解读
爆破账号
通过已收集的用户名username和尝试密码password,可以构造如下POST请求至xmlrpc.php:
<?xml version="1.0" encoding="iso-8859-1"?> <methodCall> <methodName>wp.getUsersBlogs</methodName> <params> <param><value>username</value></param> <param><value>password</value></param> </params> </methodCall>
如果爆破失败,会返回403错误,如果不幸:
扫描端口
通过Pingback可以实现服务器端请求伪造SSRF和远程端口扫描:
POST /wordpress/xmlrpc.php HTTP/1.1 Host: www.example.com Content-Length: 99 <methodCall> <methodName>pingback.ping</methodName> <params> <param><value><string>IP&PORT:http://127.0.0.1:80</string></value></param> <param><value><string>URL:http://localhost/wordpress/?page=100</string></value></param> </params> </methodCall>
若返回包中的<value><int>中的值大于0,则表示IP和PORT存在。
读取文件
<?xml version="1.0" encoding="utf-8" ?> <methodCall> <methodName>pingback.ping</methodName> <params> <param><value><string>file:///path/file/name</value></param> <param><value><string>http://localhost/wordpress/?page=100</string></value></param> </params> </methodCall>
解决方案
方案1:禁用Wordpress的pingback接口
修改主题的functions.php文件,加入以下代码:
add_filter( 'xmlrpc_methods', 'remove_xmlrpc_pingback_ping' ); function remove_xmlrpc_pingback_ping( $methods ) { unset( $methods['pingback.ping'] ); return $methods; }
方案2:禁用Wordpress的xmlrpc功能
修改主题的functions.php文件,加入以下代码:
add_filter('xmlrpc_enabled', '__return_false');
方案3:禁止外域访问xmlrpc.php文件
Nginx修改站点的.conf配置:
location = /xmlrpc.php { allow 10.10.200.200; deny all; } # 另一种方式 #location ~* ^/xmlrpc.php$ { # return 403; #}
Apache修改站点目录中的.htaccess文件:
<Files xmlrpc.php> Order Deny,Allow Deny from all </Files>
原创文章禁止转载:技术学堂 » WordPress XML-RPC接口的风险解读及解决方案