freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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安全 # 代码审计 # 若依
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录