影响版本

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,内外网渗透测试骚操作。(~ ̄▽ ̄)~

【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现的更多相关文章

  1. Java框架之MybatisSQL注入漏洞

    一.SQL注入漏洞基本原理 在常见的web漏洞中,SQL注入漏洞较为常见,危害也较大.攻击者一旦利用系统中存在的SQL注入漏洞来发起攻击,在条件允许的情况下,不仅可以获取整站数据,还可通过进一步的渗透 ...

  2. 简单分析什么是SQL注入漏洞

    现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的.但是事实是这样吗?我们学这些,不仅要知其然,更要知其所以然! ...

  3. 什么是简单的分析SQL注入漏洞

    如今非常多人在入侵的过程中基本都是通过SQL注入来完毕的,可是有多少人知道为什么会有这种注入漏洞呢?有的会随口说着对于字符的过滤不严造成的. 可是事实是这样吗?我们学这些.不仅要知其然.更要知其所以然 ...

  4. WordPress Cart66 Lite插件HTML注入漏洞

    漏洞名称: WordPress Cart66 Lite插件HTML注入漏洞 CNNVD编号: CNNVD-201310-525 发布时间: 2013-10-23 更新时间: 2013-10-23 危害 ...

  5. WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞

    漏洞名称: WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞 CNNVD编号: CNNVD-201310-499 发布时间: 2013-10-23 更新时间: 20 ...

  6. WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞

    漏洞名称: WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞 CNNVD编号: CNNVD-201309-388 发布时间: 2013-09-24 更新 ...

  7. WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞

    漏洞名称: WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞 CNNVD编号: CNNVD-201308-281 发布时间: 2013-08-20 更新时间: 2013-08- ...

  8. 浅析PHP框架Laravel最新SQL注入漏洞

    PHP知名开发框架Laravel,之前在官方博客通报了一个高危SQL注入漏洞,这里简单分析下. 首先,这个漏洞属于网站coding写法不规范,官方给了提示: 但官方还是做了修补,升级最新版本V5.8. ...

  9. 企业安全03Django GIS SQL注入漏洞CVE-2020-9402

    Django GIS SQL注入漏洞CVE-2020-9402 一.漏洞描述 Django是Django基金会的一套基于Python语言的开源Web应用框架.该框架包括面向对象的映射器.视图系统.模板 ...

随机推荐

  1. Table.NestedJoin合并…Join(Power Query 之 M 语言)

    数据源: "销量表"和"部门表"两个查找表,每个表中都有"姓名"列 目标: 根据"姓名列"将"部门表" ...

  2. 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1

    本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...

  3. Eclipse切换不同版本的jdk

    var会在java1.8中报错,安装10版本以上的jdk可以解决问题,但是安装后Eclipse无法正常工作,后来发现是Eclipse没有切换版本,在网上找了好多教程都是切换系统变量,后来我发现可以直接 ...

  4. CF507A Amr and Music 题解

    Content 有一个容量为 \(k\) 的背包.有 \(n\) 个物品,第 \(i\) 个物品的体积为 \(c_i\).请求出背包最多能够装下的物品的个数,并输出任意一个方案. 数据范围:\(1\l ...

  5. CF1440A Buy the String 题解

    Content 有 \(t\) 组询问,每组询问给出一个长度为 \(n\) 的 \(0/1\) 串,你可以花 \(h\) 的代价把 \(0\) 修改成 \(1\) 或者把 \(1\) 修改成 \(0\ ...

  6. shell 文件读取批量处理

    cat ./redis-keys.txt | while read myline do echo ${myline} /usr/local/bin/redis-cli -h 000.00.00.000 ...

  7. Linux(centos)使用nc命令发送测试数据

    安装 yum -y install nmap-ncat 简单使用 nc -lk 7777 # 开启一个本地7777的TCP协议端口,由客户端主动发起连接,一旦连接必须由服务端发起关闭 nc -vw 2 ...

  8. JAVA判断是否是微信内置浏览器,是否是在微信内打开

    /** * 通过请求头判断是否是微信内置浏览器,是否是在微信内打开 * @param request * @return */ @RequestMapping(value = "/hello ...

  9. python3实战之字幕vtt与字母srt的相互转换

    关于 0.本文将介绍一个字幕格式vtt与srt相互转换的py脚本. 1.代码大部分出自: https://www.cnblogs.com/BigJ/p/vtt_srt.html 2.但是自己针对上面的 ...

  10. 【LeetCode】190. Reverse Bits 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 二进制字符串翻转 位运算 日期 题目地址:https://le ...