
Análise técnica e exploit de prova de conceito para CVE-2021-43408, uma vulnerabilidade de injeção de SQL no plugin Duplicate Post do WordPress versão 1.1.9, com guia de exploração passo a passo e recomendações de remediação.
WordPress é um software de código aberto do tipo CMS (Content Management System), ou seja, um sistema de gerenciamento de conteúdo. Em vez de usar a linguagem HTML, o WP é escrito na linguagem de programação PHP, usando a plataforma de dados MySQL. O WordPress foi fundado pelos programadores Matt Mullenweg e Mike Little. Atualmente, o WordPress pertence à empresa Automattic, com sede em San Francisco, Califórnia, nos Estados Unidos.
O plugin Duplicate Post do WordPress, nas versões 1.1.9 e anteriores, apresenta uma vulnerabilidade de SQL Injection. Esse tipo de exploração permite que o atacante insira consultas SQL, podendo ler, modificar e até excluir recursos no banco de dados.
Essa vulnerabilidade pode ser explorada por qualquer usuário autenticado com permissão para usar os recursos do plugin Duplicate Post. Por padrão, somente o Admin tem essa permissão; no entanto, as permissões podem ser ajustadas, de modo que Editor, Autor, Colaborador e até mesmo Assinante também possam usar este plugin.
A vulnerabilidade CVE-2021-43408 foi encontrada em "11/19/2021" e avaliada como na escala CVSS.
HIGH
A causa raiz dessa vulnerabilidade é que os dados enviados na requisição do usuário não são sanitizados antes de serem usados na execução da consulta SQL.
Mais especificamente, no arquivo post/handler.php, na função cdn_insert_post()
function cdp_insert_post($id, $data, $times, $areWePro, $isChild = false, $p_ids = null, $site) {
// Get Wordpress database
global $wpdb;
// Create empty array for new id(s) and error(s)
$results = array('ids' => array(), 'error' => 0, 'counter' => 0);
// Get Counter value
$prefix = (($site != -1) ? $wpdb->get_blog_prefix($site) : $wpdb->get_blog_prefix());
$newestId = $wpdb->get_results("SELECT post_id FROM {$prefix}postmeta WHERE meta_key = '_cdp_origin' AND meta_value = {$id} ORDER BY post_id DESC LIMIT 1", ARRAY_A);
$idé controlado pelo atacante
A variável $id é passada para a função que contém a consulta SQL sem passar por qualquer sanitização. Essa função é chamada através do Ajax do WordPress wp_ajax_cdp_action_handling.
Percebe-se que o parâmetro id é passado pela função cdn_sanitize_array, onde os campos de dados do post passam pela função sanitize_text_field, que escapa qualquer aspa ' na string de dados.

Os campos de dados passam por
sanitize_text_field
No entanto, o código tem uma vulnerabilidade ao passar os dados do campo Integer para a execução da consulta SQL (campo id). O atacante pode explorar isso e inserir comandos SQL adicionais no valor desse campo. Portanto, para controlar a consulta SQL, o atacante só precisa evitar o uso do caractere '.
Passo 1: Faça login como usuário Admin e instale o plugin Duplicate Post versão 1.1.9. Este plugin auxilia os usuários na duplicação de postagens existentes.

Passo 2: Acesse o menu Post, escolha uma postagem, selecione a ação Copy e clique em Apply.

Passo 3: Selecione Setting: Default e clique em Copy.

Passo 4: Intercepte a requisição HTTP. O campo de dados que deve ser observado aqui é o id; é possível ver que o valor desse campo é do tipo numérico Integer.

Passo 5: Insira o payload de SQL Injection, envie a requisição e observe que o servidor só retorna a resposta após 9s -> SQL Injection bem-sucedida.
Payload: 1 and (select*from(select(sleep(9)))a)--

