CVE-2022-20261 Wordpress的插件SQL注入漏洞分析及修补

WP的数据库操作类`WP_Query`中被发现存在SQL Injection漏洞,`WP_Query `是WP提供的一个用于处理复杂 SQL 查询的类,用户可以通过`WP_Query`完成数据库的查询操作。

墨菲安全实验室
墨菲安全实验室   Follow

# 简介

WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统,由于它的便利性而被大量使用。WordPress以下简称为WP。

在2021年底Ngocnb[https://twitter.com/ngocnb915]的团队该漏洞被发现,2022年1月6日NVD更新该漏洞数据,WP的数据库操作类WP_Query中被谁发现存在SQL Injection漏洞,WP_Query是WP提供的一个用于处理复杂 SQL 查询的类,用户可以通过WP_Query完成数据库的查询操作。

大量使用最好有数据支撑

CVE-2022-20261 是谁什么时候发现的漏洞

# 漏洞影响

漏洞等级:7.5

影响版本:WordPress < 5.8.3

# 修复版本或方法

WordPress 5.8.3已经修复了该问题。

查看补丁更新,地址为https://github.com/WordPress/WordPress/commit/271b1f60cd3e46548bd8aeb198eb8a923b9b3827

# 漏洞分析

漏洞触发路径:wordpress/wp-includes/class-wp-tax-query.php

查看漏洞触发点clean_query函数,该函数的工作是为 SQL 查询中的条件创建子句,具体而言,它的工作是处理接收到的数据,将这些数据组合成 SQL 查询中的条件,将其返回给父函数。

漏洞触发点 路径写上

代码图片为白底

谁从 get_sql_for_clause 调用 clean_query 函数

clean_query用户是否可以触发,如何触发

clean_query没有进行具体代码分析

img

在函数transform_query 中会先进行两次传入的数据检测,如果$query['field'] == $resulting_field或者$query['terms']的变量值为空它将返回并且不做进一步处理,当通过检测时,$query['terms']直接传入函数transform_query

$query['field']$resulting_field$query['terms']是什么数据

img

可以设置 $query ['field'] 的值为 term_taxonomy_id,这样函数会直接返回,根据 clean_query 处理参数 $clause 的引用对象,然后赋值给 $terms,当 IN==$operstor 时,调用函数 implode, 将数组 $terms 转换为字符串。

漏洞分析最开始说的clean_query 函数为注入点,但这又写的绕过clean_query函数,需要统一clean_query的作用

img

在将 $terms 字符串拼接进入 $where,并最终带入 SQL 查询语句。

img

可以通过构造特殊 $query,导致输入参数无过滤处理就直接带入 SQL 语句,导致出现 SQL 注入漏洞。

函数的完整调用链条

img

# 复现漏洞

通过前面的分析,我们知道参数query只需要满足以下2个条件,就可以触发SQL注入漏洞

$query ['include_children'] 取值为 false(或者 is_taxonomy_hierarchical ($query ['taxonomy']) 取值为 false);

$query ['field'] 取值为 term_taxonomy_id

# 参考链接

https://cognn.medium.com/sql-injection-in-wordpress-core-zdi-can-15541-a451c492897

https://blog.csdn.net/Destiny_one/article/details/123420005?utm_source=app&app_version=5.2.0&utm_source=app