freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

若依-SQL注入漏洞分析
2021-11-13 17:15:42

利用

讲一下若依框架的SQL注入漏洞,攻击手法十分简单,如下

https://blog.csdn.net/Guapichen/article/details/119212781(使用了师傅的原图)

注入点:在/system/role/list接口的params[dataScope]参数

image-20211018182619849

注入点分析

若依框架使用的SQL框架是mybatis,使用xml写SQL语句。大家都知道,mybatis里,${}此类写法是不转义的,而#{}此类写法是转义的。

所以在若依框架中,找SQL注入漏洞,应该是全局搜索:

${

后缀名为.xml的文件

但是通过全局搜索,并没有找到xml文件,是因为idea有搜索条数限制

image-20211018184555556

所以我们需要修改搜索条数,方法如下:

工具栏Help --> Find Action --> Registry --> 将改成10000

image-20211018184918926

当我们搜索条数够多,加上文件后缀过滤,发现搜索到Mybatis的xml文件中含有${xxx}

image-20211018185608431

任意打开红圈中的文件,可以看到${params,dataScope}直接拼接在了SQL语句中,因此极有可能存在SQL注入

image-20211018185850213

这段SQL查询的id为selectDeptList,全局搜索selectDeptList

从Controller --> Mapper --> Service --> ServiceImpl,都没有过滤动作,因此判断存在SQL注入

image-20211018192746197

若依对该漏洞的修复手段

可以看到在v4.6.2版本时修复了SQL注入问题

image-20211018204502356

在码云上搜索4.6.2版本的改动情况

https://gitee.com/y_project/RuoYi/commit/e1cab(删括号)589f2acf4e835ad5ab310bdbe71f2dd646d

image-20211018210221368

/system/dept/list接口为例,作调试,进行分析

该接口对应的Controller方法中,调用了selectDeptList去查询部门列表

POST /system/dept/list?deptId=1&deptName=12&email=1&leader=1&orderNum=2&parentId=1&parentName=1&phone=1&remark=1&params%5bdataScope%5d=1 HTTP/1.1
Host: 10.10.1.216:8070
Content-Length: 0
accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
Origin: http://10.10.1.216:8070
Referer: http://10.10.1.216:8070/swagger-ui/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=ef4fff39-1df8-4b5e-92a9-841aee13afba
Connection: close
@RequiresPermissions("system:dept:list")
@PostMapping("/list")
@ResponseBody
public List<SysDept> list(SysDept dept)
{
    List<SysDept> deptList = deptService.selectDeptList(dept);
    return deptList;
}

selectDeptList该方法含有DataScope的注解

image-20211018194600827

DataScopeAspect.java中,对dataScopePointCut()方法配置了DataScope的注解

在dataScopePointCut()方法执行前,下面有个doBefore()方法,基本可以确定doBefore()方法包含对SQL注入的防护

image-20211018194748174

进入clearDataScope()方法,params对象获取到所有的body参数。若params不为空且params继承于BaseEntity,则清空params中的params[dataScope]

可以看到params的对象即为SysDept类的实例,而SysDept类继承于BaseEntity

我看了所有xml中包含$params[dataScope]的SQL方法对应的实体类,每一个类都继承于BaseEntity

因此若想产生SQL注入,可params instanceof BaseEntity必然为true且params必不为空,从而导致dataScope被清空,从而使SQL注入无法生效

/**
 * 拼接权限sql前先清空params.dataScope参数防止注入
 */
private void clearDataScope(final JoinPoint joinPoint)
{
    Object params = joinPoint.getArgs()[0];
    if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
    {
        BaseEntity baseEntity = (BaseEntity) params;
        baseEntity.getParams().put(DATA_SCOPE, "");
    }
}

image-20211018201612315

/**
 * 部门表 sys_dept
 * 
 * @author ruoyi
 */
public class SysDept extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 部门ID */
    private Long deptId;

    /** 父部门ID */
    private Long parentId;

    /** 祖级列表 */
    private String ancestors;

总结:若依框架对此次SQL注入的防护手段,就是在SQL方法生效之前,先把dataScope清空,即使xml中的SQL语句不变,SQL注入也无法生效了。

# SQL注入 # web安全 # 代码审计 # 若依
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录