分享

代码审计(一)

 zZ华 2023-02-12 发布于广东

代码审计(一)

系统架构

基于Java语言,采用流行的架构整合相关主流技术开发的网站/系统,SpringBoot+springsecurity+mybatis等。

项目目录

src/main 下面有两个目录,分别是 java 和 resources java 目录中主要存放的是java代码
resources 目录中主要存放的是资源文件,比如:html、js、css等 在 java 目录下还有其他一些常见目录,具体含义整理如下:
/java目录下:
annotation :放置项目自定义注解
controller/ : 存放控制器,接收从前端传来的参数,对访问控制进行转发、各类基
本参数校验或者不复用的业务简单处理等。
dao/ : 数据访问层,与数据库进行交互,负责数据库操作,在Mybaits框架中存放自定
义的Mapper接口
entity/ : 存放实体类
interceptor/ : 拦截器 service/ : 存放服务类,负责业务模块逻辑处理。Service 层中有两种类,一是
Service ,用来声明接口;二是 ServiceImpl ,作为实现类实现接口中的方法。
utils/ : 存放工具类
dto/ : 存放数据传输对象(Data Transfer Object),如请求参数和返回结果
vo/ : 视图对象(View Object)用于封装客户端请求的数据,防止部分数据泄漏,保证
数据安全
constant/ : 存放常量
filter/ : 存放过滤器
/resources目录下:
mapper/ : 存放Mybaits的mapper.xml文件
static/ : 静态资源文件目录(Javascript、CSS、图片等),在这个目录中的所有文
件可以被直接访问
templates/ : 存放模版文件
application.properties 或 application.yml : Spring Boot默认配置文件

Maven简介

Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反 映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个 依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。当我们使用 Maven 的使用,通过一个自定义的项目对象模型,pom.xml 来详细描述我 们自己的项目。简单来说,我们开发一个JavaWeb项目是需要加载很多依赖的,使用Maven可以便于管 理这些依赖。pom.xml POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表 示,名称叫做 pom.xml 。该文件用于管理:源代码、配置文件、开发者的信息和角 色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。Maven项 目中必须包含 pom.xml 文件。需要导入的依赖应该在 pom.xml 中进行配置与填写。比如导入某些依赖,如下图所 示: 

图片

project - project 是 pom.xml 中描述符的根。
modelVersion - modelVersion 指定 pom.xml 符合哪个版本的描述符。maven 2 和 3 只能为 4.0.0。parent - maven 支持继承功能。子 POM 可以使用 parent 指定父 POM ,然后继承
其配置。
dependencies - 在dependencise中进行依赖配置
groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称
的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。
artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在
artifactId 中包含点号(.)。version - 版本信息。

SpringBoot简介

SpringBoot是一款基于JAVA的开源框架。目的是为了简化Spring应用搭建和开发流程。是目前比较流行,大中小型企业常用的框架。正因为极大简化了开发流程,才收到绝大 开发人员的喜爱。SpringBoot核心原理是自动装配(自动配置),在这之前,开发一个 JavaWeb,Spring等项目要进行很多配置,使用了SpringBoot就不用在过多考虑这些方 面。并且在SpringBoot中还内置了Tomcat。

SpringBoot 常用注解

@Controller 注解:标注该类为controller类,可以处理http请求。@Controller一般要
配合模版来使用。现在项目大多是前后端分离,后端处理请求,然后返回JSON格式数
据即可,这样也就不需要模板了。
@ResponseBody 注解:将该注解写在类的外面,表示这个类所有方法的返回的数据
直接给浏览器。@RestController 相当于 @ResponseBody 加上 @Controller @RequestMapping 注解:配置 URL映射 ,可以作用于某个Controller类上,也可以作
用于某Controller类下的具体方法中,说白了就是URL中请求路径会直接映射到具体方法
中执行代码逻辑。
@PathVariable 注解:接受请求URL路径中占位符的值,示例代码如下图所示:

图片

@RestController 相当于 @ResponseBody 和@Controller的结合体 声明rest风格
@GetMapping 前端发起一个get请求到此接口 依次类推 @PostMapping
@Api 上图Swagger Swagger 是一款RESTful接口的文档在线自动生成加功能测试的软件。目的是为了减少与其他团队的沟通成本,因此会使用Swagger构建RESTful API文档来描述所有的接口信息。

SpringSecurity简介

Spring 是一个非常流行和成功的java应用开发框架。Spring Security 基于Spring 框架, 提供了一套web应用安全性的完整解决方案。一般来说,Web 应用的安全性包括两部分:

  1. 用户认证(Authentication)   用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该 系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认 证过程。

  2. 用户授权(Authorization)   用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户 所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可 以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、 HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

Mybatis简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱 动、创建连接、创建statement等繁杂的过程。

Mybatis拼接sql有下面两种方式:
#{} 告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这
样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中。
${} 仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,类似于直接
替换字符串,会导致SQL注入产生。like+#{ }

Swagger简介

Swagger 是一款RESTful接口的文档在线自动生成加功能测试的软件。目的是为了减少与 其他团队的沟通成本,因此会使用Swagger构建RESTful API文档来描述所有的接口信息。

常见Swagger敏感信息泄露的路径:
/swagger/
/api/swagger/
/swagger/ui/
/api/swagger/ui/
/swagger-ui.html/
/api/swagger-ui.html/
/user/swagger-ui.html/
/swagger/ui/
/api/swagger/ui/
/libs/swaggerui/
/api/swaggerui/
/swagger-resources/configuration/ui/
/swagger-resources/configuration/security/

Thymeleaf简介

Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发。模板引擎(这里特 指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它 可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。从字面 上理解模板引擎,最重要的就是模板二字,这个意思就是做好一个模板后套入对应位置 的数据,最终以html的格式展示出来,这就是模板引擎的作用。

SpringBoot Actuator简介

Actuator主要用于公开有关正在运行的应用程序的运行信息 - 运行状况,指标,信息, 转储,env等等。它使用HTTP端点或JMX bean来使我们能够与它进行交互。一些常见的执行端点:

/beans:此端点返回应用程序中配置的所有bean的列表。
/env:提供有关Spring Environment属性的信息。
/health:显示应用程序运行状况
/info:显示应用程序信息,我们可以在Spring环境属性中配置它。
/mappings:显示所有 @RequestMapping 路径的列表 。
/shutdown:允许我们正常关闭应用程序。
/threaddump:提供应用程序的线程转储。

Druid简介

Druid是阿里研发的一款数据库连接池,其开发语言为java,druid集合了c3p0、dbcp、 proxool等连接池的优点,还加入了日志监控、session监控等数据监控功能,使用Druid 能有效的监控DB池连接和SQL的执行情况。

以上均有可能出现的漏洞

Spring Security验证绕过漏洞
Spring Security认证绕过
Spring Boot框架SPEL表达式注入漏洞
Spring Security未经授权的访问
Spring Boot Actuator命令执行漏洞
Spring Boot Actuator hikari配置不当导致的远程命令执行漏洞
Spring Boot Actuator jolokia 配置不当导致的XXE漏洞
Spring Boot Thymeleaf 模板注入
Spring Boot Tomcat导致的JNDI注入
Spring Boot eureka xstream deserialization rce Spring Boot h2 database query rce Spring Boot mysql jdbc deserialization rce Spring Boot sql Spring Boot whitelabel error page SpEL rce Spring Boot 修改环境属性导致的rce Spring Boot 提取内存密码
Spring Boot 获取被星号脱敏的密码的明文 (方法一) Spring Boot 路由地址及接口调用详情泄漏
Spring Boot 配置不当而暴露的路由
Druid未授权访问

审计开始

总之我的第一步开始先是从代码入手比如该系统采用的是mybatis 那么就一定会有xml文件编写sql 那么刚刚介绍 #{}是防止sql注入预编译 ${}这个自然是不防止 如下图

sql注入

图片

一个一个来测试 

图片

找到controller接口调用处

图片

一个%让他闭合

图片

下一步我直接sqlmap大法懒得手注了 

图片

经过一番探测,发现 系统管理 -> 用户管理 -> 查询 系统管理 -> 字典管理 -> 查 询 两处存在SQL注入

dirsearch 闲的没事扔里面跑一跑

图片

GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。这里脱敏密码 四种方法我都有试过 有知道的可以试试 我还是太菜了

swagger 文档

图片

组件漏洞 Fastjson

Fastjson简介 Fastjson 是Alibaba的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

FastJson中的 parse() 和 parseObject()方法都可以用来将JSON字符串反序列化成Java对象,parseObject() 本质上也是调用 parse() 进行反序列化的。但是 parseObject() 会额外的将Java对象转为 JSONObject对象,即 JSON.toJSON()。所以进行反序列化时的细节区别在于,parse() 会识别并调用目标类的 setter 方法及某些特定条件的 getter 方法,而 parseObject() 由于多执行了 JSON.toJSON(obj),所以在处理过程中会调用反序列化目标类的所有 setter 和 getter 方法。 

图片

搜索代码看看哪里使用了parseObject结果不存在 

图片

登录爆破绕过图像验证码

这里随便发包 验证码实际就没用 这就是个练习的代码审计的项目 所以比较简陋 超级管理员就是弱口令 只不过在实际过程中 图像验证码有的可以重复利用 绕过前端校验 再不济花点钱接个识别 害 

图片

异常信息泄露

搜索关键字 e.printStackTrace() ,该函数会将异常调用信息。如下图所示: 

图片

越权 (平行越权)(垂直越权)

普通账号 

图片

这里不能垂直越权 有权限的校验 这不应该存在userId通过前端来控制 通常 解析token 或者session来的 这里将userId 修改为超级管理员的 

图片

代码处查看是修改用户是有判断是否是超级管理员的 

图片

图片

尝试改普通用户的 

图片

这里 把userId 2的给禁用了 

图片

图片

其他这就不演示了 还有

存储xss

这里怎么说就是见框就x 

图片

没啥技术含量 其他就不找了 随便一处都是 到这里就简单审计一下 就不细节去展示了 害

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多