WordPress拥有开源、功能丰富、用户友好的内容管理系统(CMS),为当今近33%的网站提供了强大的支持。这种受欢迎程度也使得它成为了网络犯罪的显著目标。可能WordPress的一个小漏洞就会为未来的数据泄露问题埋下严重隐患。此外,一些过时的网站使用不安全的第三方插件或组件也可能会带来安全问题。

2019年2月19日,RIPS科技公司的Simon Scannell发表了他关于WordPress中可能导致远程代码执行(RCE)的核心漏洞的发现,这些漏洞被指定为CVE-2019-8942和CVE-2019-8943。简单来说,如果能成功利用这些安全缺陷,且攻击者的身份权限至少在作者权限之上,那么攻击者就可以执行超文本预处理器(PHP)代码并获得完全的系统控制。受影响的WordPress版本包括版本5(5.0.1之前)和4(4.9.9之前)。这些漏洞也已披露给了WordPress的安全团队。

这篇文章旨在阐述漏洞的技术细节,比如潜在的攻击可能是什么样的,以及如何利用漏洞攻击一个WordPress站点。

具有作者权限的攻击者可以将嵌入在图像文件中的PHP代码上传到某个WordPress站点。上传的文件将保存在wp-content/ uploadfolder中;与此同时,在wp_postmeta表中也会有该图片信息的记录。

图1.显示CVE-2019-8942是如何被利用的

通过CVE-2019-8942,攻击者可以将_wp_attached_file的meta_key(用于检索存储在数据库中的值并显示它)修改为任意值。利用该漏洞需要发送post请求,一般正常的请求不会在请求中包含文件参数,而攻击者创建的请求中通过携带文件参数对_wp_attached_file的meta_key进行更新。如图3所示,同样的情况也可以在数据库表中观察到。

图2.显示PHP文件是如何嵌入的(方框圈出部分)

图3.显示数据库中已修改的文件名(方框圈出部分)

WordPress 4.9.9和5.0.1之前的版本没有检查哪些MetaData字段通过请求更新。攻击者可以利用这一点更新_wp_attached_file 的meta_key值或更改为任意值。

而在补丁版本中,在admin/include / POST .php中添加了新函数_wp_get_allowed_postdata(),以检查在编辑请求中是否发送了“file”,“meta_input”或“guid”,并在更新POST请求之前将其删除。图3显示,利用CVE-2019-8942可以让黑客修改数据库中的文件名,类似于路径遍历(例如evil1.jpg?../和../evil1.jpg)。

攻击者可以将CVE-2019-8942的攻击与另一个漏洞CVE-2019-8943连接起来,后者可以让攻击者将上传的文件移动到可以成功执行嵌入式PHP代码的任意目录中。

图4显示了CVE-2019-8943的作用。在wp-admin/include /image.php中的wp_crop_image函数(允许WordPress用户将图像裁剪到给定的大小或分辨率)中,php在保存文件之前不会验证.dst(绘图表文件)的文件路径。

图4.wp_crop_image函数没有验证.dst文件路径

图5.wp_crop_image函数试图访问本地文件

在可能的攻击场景中,一旦修改了meta_key中的文件名,文件(例如图3中的evil1.jpg?../和../evil1.jpg)将不会在upload目录中找到。因此,它将回退到wp_crop_image函数中的下一个If条件,并尝试通过URL访问该文件。此步操作需要在WordPress站点中安装文件复制插件。请求如下所示:

hxxps[:]//vulenrablewesbite/wp-content/uploads/evil1.jpg?../../evil1.jpg

在加载图像时,“?”之后的路径将被忽略。图像加载后,攻击者可以裁剪图像,它将遵循路径遍历并将其保存在任意目录中。

CVE-2019-8942作为CVE-2019-8943的前提条件,前者修补完善后,后者也将失去利用空间。这是因为_wp_attached_file中的meta_key首先需要更新或修改为路径遍历文件名,才能执行嵌入式PHP代码。

更重要的是,这些漏洞突出了开发人员通过设计实践安全性的重要性,管理员也需采用安全准则来减少其网站的攻击面。定期更新CMS或使用虚拟补丁、始终如一的检查网站及其基础设施或组件是否存在可利用的漏洞、执行最小特权原则,禁用或删除过时或易受攻击的插件。