微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现

影响版本

wordpress < 5.8.3

分析

参考:https://blog.csdn.net/qq_46717339/article/details/122431779

在 5.8.3 版本中,wordpress 已经修复了这个错误,比较[提交更改][Link 1]可以在处理变量之前clean_query添加检查的函数中看到。$query['field']``$query['terms']

函数clean_query是从 调用get_sql_for_clause。阅读该函数代码会发现,该函数的工作是为 sql 查询中的条件创建子句,具体来说,它的工作是处理接收到的数据,将这些数据组合成 sql 查询中的条件。将其返回给父函数。所以我们可以控制这个函数的返回数据,也就是说我们可以控制SQL查询,进行sql注入。

回到函数clean_query,当这个改动没有做的时候,认情况下$query['terms']只会删除in的值,然后再调用$this->transform_query( $query, 'term_taxonomy_id' );

为了避免下降if,它$query['taxonomy']需要为空或is_taxonomy_hierarchical返回false的值。

函数transform_query将检查$query['field'] == $resulting_field,如果为真,则返回并且不做进一步处理,因此如果变量$query['field']term_taxonomy_id,我们可以退出函数而不更改变量值$query['terms']

(这里的比较是使用==并且存在Loose比较的漏洞,在某些情况下这个错误可以用来随意创建条件句)。

函数逃逸后,返回原位的代码流会调用clean_query函数get_sql_for_clause,变量的值$query['terms']会直接作为SQL查询条件,导致sql注入。

利用链

WP_Query#__construct
    WP_Query#query
        WP_Query#get_posts
            WP_Tax_Query#get_sql
                WP_Tax_Query#get_sql_clauses
                    WP_Tax_Query#get_sql_for_query
                        WP_Tax_Query#get_sql_for_clause

主要参数$query只需要满足以下2个条件,就可以触发sql注入漏洞:

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

虽然这是wordpress核心的bug,但是wordpress核心的复用方式并不能触发错误,在插件主题中会自动转向错误方向。WP_Query当你要查询数据库时,插件/主题调用该类,从源代码中识别错误方法是在使用时WP_Query($data)和 $data 是可控的。

例如,new WP_Query(json_decode($_POST['query_vars']))有效载荷将采用以下形式:

query_vars={
     "tax_query":{
     "0":{
     "field":"term_taxonomy_id","terms":["<inject>"]}}} 

query_vars={ 
     "tax_query":{
     "0":{
     "taxonomy":"nav_menu","field":true,"terms":["<inject>"]}}}

环境搭建

0 本地下载wordpress 5.8.2

1 首先自己建一个数据库,供wordpress使用。

注意 自己先建一下数据库wordpress无权建立数据库,否则会安装不成功。

2 PHPstudy 把wordpress放进去就可以

3 访问http://127.0.0.1/wordpress-5-8-2/wordpress/开始安装,选择自己刚才创建的数据库即可。

4 搭建完成。登录后台的记得要注销退出,否则无法复现。

修改配置

为了看到报错信息,可以将debug打开,如果不打开只能盲注,延时或者外带

复现

检查是否修复

首先看下wp-includes/class-wp-tax-query.PHP 559行是否变化,我下载的5.8.2 已经修补了,需要注释掉。

然后疯狂打断点

打断点

我在主题的位置新添加一个函数,并加入到action

断点如下,不会的照着打就可以了。

functions.PHP 640行开始

function wp_query_test(){
    $c=stripslashes($_POST['data']);
    $d = json_decode($c, true);
    $wp=new WP_Query($d);
    wp_die();
}
add_action('wp_ajax_nopriv_test','wp_query_test',1);

wp-includes/class-wp-tax-query.PHP


打完开始请求

构造报错请求

构造请求如图所示

构造延时请求

报错需要开启debug,但是debug关闭,所以盲注

构造外带请求

注意点

登录之后,这个点就不能利用了

认只能盲注

wordpress不开启debug所以不会报错回显,所以只能盲注,外带

z2o安全攻防交流群

加入星球不定时分享最新漏洞复现POC渗透测试新工具内外网渗透测试骚操作

加群不定时分享 最新漏洞复现POC内外网渗透测试骚操作。(~ ̄▽ ̄)~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐