WordPress是一个注重美学、易用性和网络标准的个人信息发布平台。使用WordPress可以搭建功能强大的网络信息发布平台,但更多的是应用于个性化的博客。根据w3techs.com对WordPress网站的实时市场份额统计,WordPress占所有使用内容管理系统的网站的58.9%。大约占所有网站的27.9%左右。
WordPress 4.6 版本存在一个非常严重的远程代码执行漏洞,未经授权的攻击者利用该漏洞就能实现远程代码执行,针对目标服务器实现即时访问,最终导致目标应用服务器的完全陷落。
漏洞分析
首先来看wp-login.php文件:
通过GET获取action的值,这里的action可以理解为WordPress的url路由,这个漏洞我们使用的是lostpassword这个路由。
然后进入进入retrieve_password()函数:
这里通过POST获取user_login也就是用户名,然后获取该用户的相关信息。
最后将该用户的user_mail等信息传入wp_mail函数。所以这里的用户必须是存在的用户。
跟进wp_mail函数,wp-includes/pluggable.php文件:
在wp_mail函数中看到这样一段代码:
将$_SERVER[‘SERVER_NAME’]里面的内容带入了from_email变量,然后from_email变量进入了setFrom函数,跟进:
在setFrom函数中只是设置了邮件的发送者和接受者一些信息,这里设置的信息后面有用,特别注意这里的$this->Sender。
最后进入send函数,跟进send函数,class-phpmailer.php文件:
继续跟进postsend函数:
这里的调用的系统mail,所以进入mailsend函数,继续跟进:
可以看到这里的$this->Sender,也就是我们的address,也就是from_email赋值给力params变量,然后params变量进入了mailPassthru函数,跟进:
最后params进入了mail,而且是第五个参数,这里的mail就是系统发送邮件的接口。
看到这里应该就明白了漏洞的产生原因了,就是服务器SERVER_NAME的值进入到mail这里的第五个参数了,至于为什么进入第五个参数就会导致漏洞请关注之前那个phpmailer命令执行漏洞(CVE-2016-10033)细节。
漏洞验证
- 首先的获取当前WordPress的用户,这里我们使用amdin用户;
- 然后发送请求:
在发送请求之前,你可以在另外一个主机上监听一个端口,比如这里我在10.5.1.2上监听9999端口。
可以看一看进入mail的第五个参数的内容就是我们带入host中的payload。
如果漏洞存在,我们的主机10.5.1.2上监听的端口上就会收到请求:
此漏洞已经有反弹shell的利用脚本了,这里就不在演示(网上那个程序验证有很多坑,使用时请仔细阅读并修改)。
这个漏洞环境搭建已经漏洞利用有一些需要注意的地方请参考此文:
漏洞修复
在最新版本的WordPress中对传入mail的第五个参数params进行了过滤处理:
self::isShellSafe($this->Sender),并且升级了PHPMailer版本。
所以请使用WordPress的同学升级到最新版即可。
如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880