之前我寫過一篇文章,使用 fail2ban 防止 Bind9 被用於 DNS 放大攻擊,萬萬沒想到,原來 WordPress 本身也可以用來進行放大攻擊,原理就是它的 pingback的 機制。
Pingback 是 WordPress 的一個網站之間互相通知工具,比如 A 博客引用了一個 B 博客文章的鏈接,那麼 WordPress 就可以自動幫你通知 B 博客,告訴博主你引用了他的文章。
這本來是一個很不錯的功能,但有一點——Wordpress 至今沒有為這個 Pingback 做安全檢測。Wordpress 在收到 Pingback 時會檢測來源站是否有效——這要和源站進行通信,但它並沒有檢測發來 pingback 和 pingback 裡攜帶的 ip 是否相同……
也就是說,發送上萬個包含另一個網站的 ip 的 pingback 給 100 個 WordPress,那麼就可以通過反射放大成 100萬 次 TCP 連接給那個網站!
這不就是 拒絕服務 麼 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
你好, 原始作者在這裡. 對不起,我不懂中文 ; 但是據我了解,您建議完全關閉WordPress引用機制 ?
總的來說這不是一個好主意, 在我看來,就像是醫生開槍治療他. 而不是採取激進的措施, 文章中討論了一個簡單的修復方法 : 只需檢查xmlrpc的調用者是否使用與報告的引用網站相同的IP. 這為討論的擴增途徑滅菌.
…你是對的, 但是我不確定WordPress更新時xmlrpc.php是否變回, 這就是為什麼我將其關閉.
🙁