之前我写过一篇文章,使用 fail2ban 防止 Bind9 被用于 DNS 放大攻击,万万没想到,原来 WordPress 本身也可以用来进行放大攻击,原理就是它的 Pingback 机制。
Pingback 是 WordPress 的一个网站之间互相通知工具,比如 A 博客引用了一个 B 博客文章的链接,那么 WordPress 就可以自动帮你通知 B 博客,告诉博主你引用了他的文章。
这本来是一个很不错的功能,但有一点——Wordpress 至今没有为这个 Pingback 做安全检测。Wordpress 在收到 Pingback 时会检测来源站是否有效——这要和源站进行通信,但它并没有检测发来 pingback 和 pingback 里携带的 ip 是否相同……
也就是说,发送上万个包含另一个网站的 ip 的 pingback 给 100 个 WordPress,那么就可以通过反射放大成 100万 次 TCP 连接给那个网站!
这不就是 DDoS 么 0.0
所以,还是关了它好了……
关闭 Pingback 和 Trackback
既然这个关闭了,那么平时如果你不用到 WordPress 的 XML RPC,也一起关了算了。这个 RPC 是用来给用户远程调用 WordPress 的,比如一个客户端…… 如果你用得到,就算了。
关闭 WordPress XML-RPC 服务
这个服务在早期实际上是有漏洞的,后来直到现在,实际上 XML-RPC 服务的漏洞早已经修复(令人惊讶的是 Pingback 的漏洞却一直保留着——都这么多年了……)
在你主题的 functions.php 里,加入如下语句即可关闭:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
// 彻底关闭已经发布的文章的pingback 和 trackback add_filter( 'wp_headers', 'pmg_pk_filter_headers', 10, 1 ); function pmg_pk_filter_headers( $headers ) { if( isset( $headers['X-Pingback'] ) ) { unset( $headers['X-Pingback'] ); } return $headers; } add_filter( 'rewrite_rules_array', 'pmg_pk_filter_rewrites' ); function pmg_pk_filter_rewrites( $rules ) { foreach( $rules as $rule => $rewrite ) { if( preg_match( '/trackback\/\?\$$/i', $rule ) ) { unset( $rules[$rule] ); } } return $rules; } add_filter( 'bloginfo_url', 'pmg_pk_kill_pingback_url', 10, 2 ); function pmg_pk_kill_pingback_url( $output, $show ) { if( $show == 'pingback_url' ) { $output = ''; } return $output; } add_filter( 'pre_update_default_ping_status', '__return_false' ); add_filter( 'pre_option_default_ping_status', '__return_zero' ); add_filter( 'pre_update_default_pingback_flag', '__return_false' ); add_filter( 'pre_option_default_pingback_flag', '__return_zero' ); add_action( 'xmlrpc_call', 'pmg_pk_kill_xmlrpc' ); function pmg_pk_kill_xmlrpc( $action ) { if( 'pingback.ping' === $action ) { wp_die( __( 'Pingbacks are not supported' ), __( 'Not Allowed!' ), array( 'response' => 403 ) ); } } register_activation_hook( __FILE__ , 'flush_rewrite_rules' ); register_deactivation_hook( __FILE__, 'flush_rewrite_rules' ); /* 关闭 xml rpc 避免漏洞 */ add_filter('xmlrpc_enabled', '__return_false'); |
禁止 xmlrpc.php 访问
如果你使用 Nginx 服务,那么在你的 nginx 站点配置中加入
1 2 3 |
location /xmlrpc.php { deny all; } |
这样就完全禁止这个文件的外部访问了。
后记
要不是人家找上门说我的博客被用来反射放大攻击攻击人家网站,我还真不知道这个四五年前的安全漏洞 WordPress 到现在都没有修复……说实在的这个功能还挺好用的,我因为它,抓到了好几个粗心大意偷我文章假装原创的小伙……😂
也有朋友说,不修补这个漏洞而直接禁止这个功能,就好像医生通过杀死病人来治病……是没错啦,但考虑到每次 WordPress 更新升级有可能覆盖掉这个文件(并且不一定修复这个漏洞),并且通常情况下我也不使用这个功能,就干脆关闭好了。
参考链接
本文由 落格博客 原创撰写:落格博客 » 避免 WordPress 被用作反射放大攻击
转载请保留出处和原文链接:https://www.logcg.com/archives/3351.html
Hi, original author here. I am sorry I do not understand Chinese ; however of what I understand you are advising turning off the WordPress trackback mechanism altogether ?
This is not such a good idea in general, it seems to me like a doctor shooting the pacient to treat him. Instead of taking radical measures, there is a simple fix discussed in the article : simply check that the caller of xmlrpc uses the same IP as the website reported for trackback. This sterilizes the discussed avenue for amplification.
…you are right, but I am not sure if xmlrpc.php changed back when WordPress updated, that’s why I turning this off instead.
🙁