简介
wordpress是世界上使用最多的开源 CMS 之一。在允许开发者自己构建插件和主题来管理网站时,使用我们的许多便捷功能,wordpress的核心会提供插件/主题调用和使用wordpress函数的功能,如数据格式、查询数据库等许多选项在提供的众多类中,WP提供的查询DB的类中有SQL Injection错误:WP_Query
。WP_Query
是 WordPress 提供的一个用于处理复杂 SQL 查询的类,在 WordPress 核心框架和插件中使用范围非常广泛,用户可以通过 WP_Query
类完成数据库查询操作,方便构建 WordPress 的输出内容。
影响版本
Wordpress <= 5.8.3
漏洞分析
查看补丁更新,地址为https://github.com/WordPress/WordPress/commit/271b1f60cd3e46548bd8aeb198eb8a923b9b3827
我们可以看到,修改的最关键的位置位于wp-includes/class-wp-tax-query.php
文件当中的第599行代码,在补丁中,对$query[terms]
的赋值取决于$query['field']
的取值
我们查看漏洞触发点,触发点是 clean_query
函数
在clean_query
函数获得$query
后在559行代码中对$query[terms]
进行了array_unique
去重操作后,首先进行了一个if
判断if (is_taxonomy_hierarchical($query['taxonomy'])&&$query['include_children'])
,可以通过控制 $query ['taxonomy']
或者 $query ['include_children']
的取值使得 if
判断不成立,这样就直接将 $query ['terms']
带入了函数 transform_query
:
可以设置 $query ['field']
的值为 term_taxonomy_id
,这样函数会直接返回,也就是说可以通过控制 $query
的取值来绕过 clean_query
函数的处理。
查找调用 clean_query
函数的情况,只有位于wp-includes/class-wp-tax-query.php
文件当中的第383行的get_sql_for_clause
函数进行了调用
通过 clean_query
处理参数 $clause
的引用对象,然后赋值给 $terms
,当存在 IN
操作时,调用函数 implode
以 ,
将数组 $terms
转换为字符串,继续往下走:将 $terms
字符串拼接进入 $where
,并最终带入 SQL 查询语句。
回顾 get_sql_for_clause
函数的处理过程,可以通过构造特殊 $query
,导致输入参数无过滤处理就直接带入 SQL 语句,导致出现 SQL 注入漏洞。
查找get_sql_for_clause
函数的调用链
可以构建一条从 WP_Query
构造函数出发,到达 get_sql_for_clause
函数的完整调用链条:
漏洞复现
通过前面的分析,我们知道参数query
只需要满足以下2个条件,就可以触发SQL注入漏洞
-
$query ['include_children']
取值为false
(或者is_taxonomy_hierarchical ($query ['taxonomy'])
取值为false
); -
$query ['field']
取值为term_taxonomy_id
举例网络上成功的两个案例结果:
漏洞修复
更新新版本即可
回顾前面的补丁对比,新版本 class-wp-tax-query.php
中的函数 clean_query
修改代码如下:
if ( 'slug' === $query['field'] || 'name' === $query['field'] ) {
$query['terms'] = array_unique( (array) $query['terms'] );
} else {
$query['terms'] = wp_parse_id_list( $query['terms'] );
}
通过函数 wp_parse_id_list
限制了 $query ['terms']
数组元素类型必须是整数。
参考
https://github.com/WordPress/WordPress/commit/271b1f60cd3e46548bd8aeb198eb8a923b9b3827
https://cognn.medium.com/sql-injection-in-wordpress-core-zdi-can-15541-a451c492897
https://www.wangan.com/p/7fy7fge221c7608a