博客老早就长满了草,最近在锄草。
最近总有人告诉我,说博客不能访问了。开始只是直接去重启一下httpd,恢复了就不管了。不过最近有点频繁出现不能访问的情况,甚至Google给我发邮件说"Increase in “404” pages on http://orczhou.com/":
于是,打算探究一下原因。
首先,先看了一下MySQL中有没有慢查询,简单的通过show processlist确认了在出现问题的时候是没有什么慢SQL。
接着去看,httpd的错误日志,错误日志啥都没有。
想想,再看看access log吧,看看有没有什么收获。果然,这里发现了一些异常的日志:
....... 31.184.195.26 - - [17/Apr/2016:03:17:28 +0000] "POST /xmlrpc.php HTTP/1.0" 200 435 185.106.92.160 - - [17/Apr/2016:03:17:32 +0000] "POST /xmlrpc.php HTTP/1.0" 200 435 31.184.195.26 - - [17/Apr/2016:03:17:43 +0000] "POST /xmlrpc.php HTTP/1.0" 200 435 185.106.92.160 - - [17/Apr/2016:03:17:49 +0000] "POST /xmlrpc.php HTTP/1.0" 200 435 .......
量化一下,看看有多少到xmlrpc.php的访问,用了如下两个命令:
grep "xmlrpc.php" orczhou.com-access_log|awk '{print $1}' orczhou.com-access_log|\ sort|uniq -c|sort -k 1 -n|tail -n 20 ...... awk '{print $1}' orczhou.com-access_log|sort|uniq -c|sort -k 1 -n|tail -n 20|\ awk '{print $2}'|xargs -n 1 -I {} grep -m 1 {} orczhou.com-access_log ......
输出如下:
[root@orczhou logs]# grep "xmlrpc.php" orczhou.com-access_log|awk '{print $1}' orczhou.com-access_log|sort|uniq -c|sort -k 1 -n|tail -n 20 ....... 4772 199.15.233.162 5050 185.106.92.160 6002 185.106.92.55 8698 49.65.243.27 9988 31.184.195.26 11278 ::1 11368 185.103.252.172 17312 89.248.167.131 [root@orczhou logs]# awk '{print $1}' orczhou.com-access_log|sort|uniq -c|sort -k 1 -n|tail -n 20|awk '{print $2}'|xargs -n 1 -I {} grep -m 1 {} orczhou.com-access_log ...... 199.15.233.162 - - [10/Apr/2016:05:16:19 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution/comment-page-1/ HTTP/1.0" 200 35571 185.106.92.160 - - [10/Apr/2016:03:19:42 +0000] "POST /xmlrpc.php HTTP/1.0" 200 370 185.106.92.55 - - [12/Apr/2016:23:38:17 +0000] "POST /xmlrpc.php HTTP/1.0" 200 370 49.65.243.27 - - [10/Apr/2016:03:19:02 +0000] "GET /index.php/2012/11/more-about-mysql-item/comment-page-1/ HTTP/1.1" 200 41404 31.184.195.26 - - [10/Apr/2016:03:19:10 +0000] "POST /xmlrpc.php HTTP/1.0" 200 370 ::1 - - [10/Apr/2016:03:19:04 +0000] "OPTIONS * HTTP/1.0" 200 - 185.103.252.172 - - [12/Apr/2016:16:33:40 +0000] "POST /xmlrpc.php HTTP/1.0" 200 370 89.248.167.131 - - [12/Apr/2016:19:06:23 +0000] "GET /xmlrpc.php HTTP/1.1" 405 42
可以看到有大量POST和GET到xmlprc的请求。
到这里,大概知道问题出在了xmlrpc.php,但是具体是什么情况还不知道。于是,进一步深入,看看到底给xmlrpc发送了什么请求。
为了看到POST表单的内容,需要开启mod_dumpio模块,该模块配置参考:Apache Module mod_dumpio。我在httpd.conf的配置文件中新增了如下内容:
...... LoadModule dumpio_module modules/mod_dumpio.so ...... <VirtualHost *:80> ....... DumpIOInput On DumpIOOutput On LogLevel debug DumpIOLogLevel debug ....... </VirtualHost>
重启httpd,于是在错误日志中就可以查看到POST的内容了:
[Wed Apr 13 08:48:05 2016] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): <?xmlversion="1.0"?><meth <methodName>pingback.ping</methodName> <params> <param><value><string>http://crystalweb.co.za</string></value></param> <param> <value><string>http://www.orczhou.com/index.php/2015/03/glance-amazon-rds-pricing/</stri </params> </methodCall>
可以看到,这里客户端发送了一个pingback请求。源地址是http://crystalweb.co.za,目标地址是我的一篇博客内容。
为什么会有大量这样的请求?追踪到这里,问题就比较明了了。在Google上一搜索,"wordpress xmlrpc pingback",第一个结果:WordPress XML-RPC PingBack Vulnerability Analysis较为细致了描述这种利用Wordpress进行DDos攻击的方法。
这里对这样问题大致描述如下:攻击者利用WordPress的XML-RPC PingBack功能,向一个第三方博客X(可以是任何一个Wordpress博客)发送一个PingBack,告诉博客X说:"喂,博客X,网页Y引用了你这篇文章"。这时,博客X会尝试去检查网页Y的内容,看看是不是真的引用了这篇文章。如果真的引用了,那么,Wordpress会在这篇博客的留言处,给出这个链接引用。如果没有引用,则返回一个错误。如果攻击者通过向大量博客发送类似的请求,就可以构成一个对网页Y的攻击。
根据这篇文章的数据,在2014年就已经有16万博客被攻击者利用进行DDos攻击。
这里不打算详细介绍Pingback功能,如果感兴趣可以通过如下链接去了解:
早期的网站都是建议直接修改Wordpress的代码,屏蔽Pingback功能,这当然不是好办法。现在已经有好几个插件可以解决这个问题,这里推荐:Disable XML-RPC Pingback
另外,如果对应IP还总是给你发到xmlrpc的话,临时还可以直接把对应的IP通过防火墙过滤掉:
iptables -A INPUT -s 185.130.5.243 -j DROP
果然问题解决,网站没有再无法访问过,Google也没有再给我发404的问题了,虽然,我觉得404未必是这个问题导致的。
Have Fun。