WordPress Core SQL注入漏洞(CVE-2022–21661)分析

发布时间 2022-01-25

漏洞概述


WordPress是目前全球流行的三大内容管理系统之一,其核心模块(Core)出现漏洞的情况相对较少。近期,WordPress核心模块被披露存在一处SQL注入漏洞(CVE-2022–21661)。针对该高危漏洞,启明星辰ADLab研究员第一时间进行了详细分析和验证。


受影响版本


受影响版本:WordPress < 5.8.3


漏洞分析


通过比较github上的源代码,可以发现漏洞的位置是clean_query函数。在5.8.2及之前的老版本中,该函数的关键代码如下。


代码如下.png


在clean_query函数中,当传递进来的$query满足以下两个条件:

$query['taxonomy']为空;

$query['filed']的值等于term_taxonomy_id。


WordPress的执行就会进入580行,调用transform_query函数。跟进该函数,满足602行,不做任何措施直接return,保持了terms的值不受改变。


代码如下.png


全局搜索clean_query,其被get_sql_for_clause函数调用。阅读该方法的代码可知,它的功能是为sql查询中的条件创建子句。具体来说,它的工作是处理接收到的数据,将这些数据组合成SQL 查询中的条件,然后将其返回给父函数。所以,如果可以控制clean_query的返回数据,就可以控制SQL查询进行注入。


在get_sql_for_clause中可以找到$terms变量被拼接到sql语句中。


代码如下.png


从get_sql_for_clause方法继续回溯,调用栈如下:


代码如下.png


在get_posts()中可以找到对WQ_Tax_Query->get_sql()的调用。


代码如下.png


通过回溯调用栈可知,通过控制WP_Query->__construct()中的属性,就可以造成sql注入。


漏洞复现


通过分析WordPress的源码发现,WordPress核心代码中不存在可以触发该漏洞的调用点。为了验证该漏洞,这里使用了Ele Custom Skin插件做漏洞复现,这也是ZDI给出的存在产生漏洞调用的插件样例。


EleCustom Skin插件安装量在10万以上,且其存在的漏洞调用是无需登录的。该插件存在方法get_document_data(),其核心代码如下:


代码如下.png

代码如下.png 

全局搜索get_document_data,该方法被注册的action名字如下。


代码如下.png


因此,该漏洞在这个插件是存在触发路径的。开启debug功能后,构造报文即可成功注入出数据库user。


代码如下.png


流行插件分析


为了分析该漏洞的实际影响,ADLab研究员还对WordPress前100个流行插件进行了分析,发现其中2个插件也存在该漏洞。


开启debug,构造报文即可成功注入出数据库user。


修复方案


目前WordPress已发布升级补丁以修复漏洞,补丁获取链接如下:


https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-6676-cqfm-gw84


参考链接:

https://www.zerodayinitiative.com/blog/2022/1/18/cve-2021-21661-exposing-database-info-via-wordpress-sql-injection