# 简介
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
没有进行具体代码分析
在函数transform_query
中会先进行两次传入的数据检测,如果$query['field'] == $resulting_field
或者$query['terms']
的变量值为空它将返回并且不做进一步处理,当通过检测时,$query['terms']
直接传入函数transform_query
。
$query['field']
和$resulting_field
和$query['terms']
是什么数据
可以设置 $query ['field']
的值为 term_taxonomy_id
,这样函数会直接返回,根据 clean_query
处理参数 $clause
的引用对象,然后赋值给 $terms
,当 IN==$operstor
时,调用函数 implode
以 ,
将数组 $terms
转换为字符串。
漏洞分析最开始说的clean_query
函数为注入点,但这又写的绕过clean_query
函数,需要统一clean_query
的作用
在将 $terms
字符串拼接进入 $where
,并最终带入 SQL 查询语句。
可以通过构造特殊 $query
,导致输入参数无过滤处理就直接带入 SQL 语句,导致出现 SQL 注入漏洞。
函数的完整调用链条
# 复现漏洞
通过前面的分析,我们知道参数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