WordPress 4.6无需认证远程命令执行漏洞分析

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的利用脚本了,这里就不在演示(网上那个程序验证有很多坑,使用时请仔细阅读并修改)。

这个漏洞环境搭建已经漏洞利用有一些需要注意的地方请参考此文:

http://xxlegend.com/2017/05/05/WordPress%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E7%8E%AF%E5%A2%83%E6%9E%84%E9%80%A0%E5%92%8CVirtualHost%E7%8E%AF%E5%A2%83%E9%AA%8C%E8%AF%81/

漏洞修复

在最新版本的WordPress中对传入mail的第五个参数params进行了过滤处理:

self::isShellSafe($this->Sender),并且升级了PHPMailer版本。

所以请使用WordPress的同学升级到最新版即可。

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880

Spread the word. Share this post!

Meet The Author

Leave Comment