一文教你学会java代码审计

news2025/2/24 0:03:50

《网安面试指南》icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect

《Java代码审计》icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484219&idx=1&sn=73564e316a4c9794019f15dd6b3ba9f6&chksm=c0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene=21#wechat_redirect

一、前置知识

本文主要讲解基础的代码审计思路与方法技巧,适合有一定java基础,无审计经验的同学学习。

二、漏洞挖掘

1、配置信息

先看pom.xml,了解到使用了哪个依赖库以及版本,从而可以确定是否存在漏洞。

图中Shiro<=1.2.4版本,存在shiro550反序列化漏洞,

图片

图片

application.yml

该配置文件可能存在数据库或其他组件的连接信息,如数据库连接信息。

图片

漏洞关键字:Fastjson <=1.2.83 Jackson <=2.9.2 POI < 3.11 DOS XXEShiro <= 1.24 Spring 5.0.x < 5.0.6 1Spring 4.3.x < 4.3.7

2、配置不当

2.1swagger接口文档泄露

图下的就是将com.sky.controller.admin包下的所有接口扫描成swagger接口调试文档。

图片

这就是访问swagger调试文档访问地址。

图片

图片

在项目审计中,swagger接口文档是不应该被用户访问的,接口文档可直接就是存在漏洞问题。

搜索关键字:doc.htmlswaggeraddResourceHandlersDocket

2.2 springboot-actuator接口未授权


这个配置确实是将所有 Actuator 端点都暴露出来,包括了 /actuator/* 下的所有端点。这意味着所有的监控和管理端点都会对外公开,包括健康检查、信息显示、配置信息、metrics 等。某些端点可能包含敏感信息,比如 /actuator/env 端点可能会暴露应用程序的环境变量。

图片

搜索关键字:management.endpoints.web.exposure.include=*endpoints.env.enabled=trueendpoints.enabled = truemanagementactuator

3.未授权访问

3.1过滤器:

该方法判断了请求url是否包含了/login.html或者register.html,如果包含就放行。

所以我们可以http://127.0.0.1/login.html/../admin/test的方法绕过过滤。

图片

关键字:doFilterFilter

3.2拦截器:

如果路径的开头是以/admin开头并且Session中的loginUser属性为 null,就会判断是否登录。

利用:构造结构路径为/;/admin或//admin后访问(不影响解析),即可绕过登录限制。

图片

关键字:InterceptoraddInterceptors

3.3shiro:

在shiro过滤器中对所有路径配置了anon匿名拦截器,即不需要认证校验。

图片

关键字:anonauthcshiro

4、SQL注入

现在大部分项目都是基于mybatis操作数据库,不使用预编译的情况就可能会导致sql注入漏洞。

简单介绍一下预编译与拼接:

占位符:#{},预编译指的是在执行 SQL 语句之前,先将 SQL 语句中的占位符(如 ?)替换为占位符对应的实际值,然后将这个已经编译好的 SQL 语句发送给数据库执行。

拼接符:${},可以用来替换 SQL 语句中的任何部分,包括表名、列名、条件等等。在执行 SQL 语句之前,MyBatis 会将 ${} 中的内容替换为相应的参数值,然后将得到的 SQL 语句发送给数据库执行。

mybatis中有些地方不能使用预编译的,这种场景下就容易出现sql注入漏洞:

动态 SQL 中的表名、列名:如果在动态 SQL 中使用 ${} 来表示表名、列名等标识符,因为这些标识符是在 SQL 解析阶段确定的,无法使用预编译参数来替换。动态 SQL 中的 SQL 语句片段:例如在 <sql> 或 <selectKey> 等元素中使用 ${},这些片段是在 SQL 解析阶段确定的,也无法使用预编译参数来替换。动态 SQL 中的 ORDER BY 字段:如果在 ORDER BY 子句中使用 ${} 来表示排序字段,因为排序字段是在 SQL 解析阶段确定的,同样无法使用预编译参数来替换。LIKE 操作中的模糊查询字符串:如果在 LIKE 操作中使用 ${} 来表示模糊查询的字符串,因为这个字符串是直接拼接到 SQL 语句中的,不会被预编译。

如图:模糊查询处无法直接使用预编译,直接使用预编译会报错。

图片

安全写法:使用concat将%%与预编译组合起来。

图片

根据此处的sql语句,跟进查看哪个函数调用了该sql。

图片

进行跟进

图片

发现了是page调用了list,而且name可控,继续跟进是哪个函数调用了page。

图片

发现了是controller层的page调用了,访问的接口为emps,即http://127.0.0.1/emps,而且name参数可控。

图片

漏洞点2:


order by后是无法使用预编译的,这种地方也容易存在sql注入。

图片

通过上面说的方法,一步一步跟,查看是那个访问接口调用了该sql语句(此处省略)

此处asc参数为漏洞点。

图片

输入asc=asc,id,(asc=asc,sql列名),回显正常。

图片

输入asc=asc,xxx,(asc=asc,不存在的sql列名),无回显数据。

图片

将数据包放到sqlmap跑一下

图片

5.ssrf

现在大部分java代码中的ssrf漏洞都不支持伪协议,基本只能进行内网探测,危害也相对较低。


漏洞示例,httpclients:

图片

这段代码只支持http请求,无法进行伪协议。​​​​​​​

关键字:HttpClientHttpClientsHttpURLConnectionopenConnection
支持伪协议函数:openConnectionURLConnectionopenStream

6.文件操作类型漏洞

文件操作类型漏洞包括:文件上传,文件下载,文件读取,文件删除等。

漏洞示例:文件名file可控而且没有对后缀进行过滤,存在文件上传漏洞,文件操作类型漏洞在白盒中还是挺多的,大多都是文件上传目录穿越。

图片

图片

关键字:new FileOutputStreamdownloaduploadFile.createTempFiletransferTonew FileInputStreamIOUtils.readFullyIOUtils.writeFileReaderfs.openfile.exists()file.delete()

7.XXE

xxe漏洞现在已经不多了,遇到的次数也很少,一般出现在支持xml文件导入或者csv,xslx文件导入(POI组件)的地方。

漏洞示例:这段代码读取xml文件,但没有明确禁用外部实体解析,所以存在xxe漏洞。

修复方法:​​​​​​​

SAXReader reader = new SAXReader();// 这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);// 如果不能完全禁用DTDs,最少采取以下措施,必须两项同时存在setFeature("http://xml.org/sax/features/external-general-entities", false);// 防止外部实体POCsetFeature("http://xml.org/sax/features/external-parameter-entities", false);// 防止参数实体POC

​​​​​​​

关键字:SAXReaderSAXBuilderXMLReaderFactory.createXMLReader();DocumentBuilderFactoryXPathExpressionDocumentHelper.parseTextTransformerFactoryUnmarshallerStringReader组件:POI < 3.11 DOS XXE

8.RCE

存在可以执行命令或者代码的函数就可能存在RCE漏洞。


漏洞案例:

在该接口中将接口传参未做过滤直接传递到继承了FelEngineImpl类的工具类中执行并返回结果,可以通过传入如导致代码注入从而执行任意命令

图片

图片

图片

图片

​​​​​​​

关键字:ProcessBuilderexecsystem()command    Runtime.getRuntime().exec()ProcessUNIXProcessProcessImplProcessBuilder.start()GroovyShell.evaluate()evalclassLoader$$BCEL$$ServiceLoaderToolProvider.getSystemJavaCompiler()getSystemClassLoaderJavaFileObjectJdbcRowSetImplTemplatesImplTransformerFactoryImplresolveClassloadClassjavax.el.ELProcessor

9.逻辑缺陷

逻辑缺陷一般出在判断条件处,例如esle if,动态sql中的if判断。若开发写的if判断条件有逻辑问题,就会出现漏洞。

漏洞案例:


这段动态sql语句中的if判断条件,判断id是否为空,不为空就删除指定id的数据。但是如果用户输入的id参数为空,这会导致生成一个类似于 delete from dish where id 的 SQL 查询语句。在这种情况下,没有指定具体的条件来限制删除操作,因此这个删除语句会删除整个表中的数据,而不管 id 参数是否为空

图片

无具体关键字,需要对项目代码逐条分析查看,判断是否存在逻辑问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何借助前端表格控件实现债券网下发行数字化?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 概要 作为金融市场中至关重要的一环&#xff0c;债券行业扮演着融资、投资、风险管理等多重角色&#xff0c;对经济的发展和稳定起着举足轻重的作用。随着证券行业全面实施注册制的推进…

硬件工程师笔试面试——上拉电阻、下拉电阻

目录 1.3、上拉电阻 原理图 1.3.1、定义 1.3.2、作用 1.3.3、工作原理 1.3.4、选择上拉电阻的值 1.3.5、应用场景 1.3.6、与下拉电阻的区别 1.3.7、设计考虑 1.3.8电路设计中的注意事项 1.3.9、与ESD保护的结合 1.3.10、实际应用 1.3.11、上拉电阻在不同电压等级的…

如何提升网站的收录率?

要提升网站的收录率&#xff0c;其中一个特别有效的工具就是GPC爬虫池&#xff0c;这个工具通过深度研究谷歌SEO算法&#xff0c;吸引谷歌爬虫。 GPC爬虫池的基本原理是构建一个庞大的站群系统&#xff0c;并创建复杂的内链和外链结构&#xff0c;以吸引并留住谷歌蜘蛛 使用GP…

BF算法Java

BF算法 代码实现运行结果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/91e0700ed8144fcc87e8f8d222c0e0b8.png) BF算法又称暴力算法&#xff0c;运算过程相对较慢&#xff0c;但是也是基础的算法&#xff0c;这里我们可以给两个字符串&#xff0c;arr1 arr2 由arr1…

Nvidia扩展AI帝国:从芯片到数据中心设计的全面布局

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

HarmonyOS开发实战( Beta5.0)自定义组件冻结功能规范

自定义组件处于非激活状态时&#xff0c;状态变量将不响应更新&#xff0c;即Watch不会调用&#xff0c;状态变量关联的节点不会刷新。通过freezeWhenInactive属性来决定是否使用冻结功能&#xff0c;不传参数时默认不使用。支持的场景有&#xff1a;页面路由&#xff0c;TabCo…

移动UI:成就勋章页面该如何设计,用例子说明。

移动应用的UI成就勋章页面通常是一个展示用户在应用中取得成就和获得勋章的页面。这种页面通常用于激励用户参与应用的活动&#xff0c;增加用户的参与度和忠诚度。 UI设计成就勋章页面时&#xff0c;一般会包括以下元素和功能&#xff1a; 1. 勋章列表&#xff1a; 展示用户…

[SWPUCTF 2022 新生赛]android2-快坚持不下去的第四天

找main函数&#xff0c;MainActivity类名 棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌加密函数 加密过程&#xff0c;key123456789 密文和this.key异或 key为987654321 # 已知信息 enc "棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌" key 987654321# 限制 key 到 16 位范围 masked_key…

springboot+vue集成cas单点登录最详细避坑版讲解

springboot+vue+cas 前言总观问题说明第一种配置方式第二种配置方式拦截器配置重定向问题解决配置前言 本地讲解的是单纯的cas,不掺和springsecurity或者shiro等权限框架 首先说明几点注意事项: cas默认不支持前端分离的,这个后便会讲到,也是最大问题所在;前端vue不能直…

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…

排列组合常用方法一:捆绑法

别问我排列组合是什么&#xff0c;自己看去 看完排列组合的计算方法&#xff0c;有些萌新就会问了&#xff0c;哎&#xff1f;有些题可不像单纯的排列组合哦&#xff0c;题目可能会提出各种奇怪的要求&#xff0c;真是五花八门耶......别急&#xff0c;接下来介绍一个方法&…

【进阶】面向对象之继承(二)

文章目录 一丶子类到底能继承父类中的哪些内容二丶继承中:成员变量的访问特点三丶练习代码呈现 四丶总结 一丶子类到底能继承父类中的哪些内容 构造方法是否可以被继承? 不可以 成员变量是否可以被继承? 可以 成员方法是否可以被继承? 可以,只有虚方法可以被继承 二丶继…

内核头文件, makfile 传参

1 内核头文件&#xff0c;主要指的是&#xff0c; 在板卡上的系统上直接 &#xff0c;编译驱动模块&#xff0c;而不是在虚拟机的内核源码中 去编译内核模块。 ------------------------------------------------------------------------------------------------------------…

将x减到零的最小操作数问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录 一题目简述&#xff1a; 二题目思路&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二题目思路&#xff1a; 首先这道题…

如何在国内下载llama模型

由于项目需求要下载llama模型&#xff0c;本来觉得这是个很简单的事情&#xff0c;直接去huggingface上下载就行&#xff0c;但是没想到遇到了重重问题&#xff0c;于是写下这篇博客记录一下&#xff0c;希望对别人也有帮助&#xff01; 刚开始搜到的教程是官方给出的&#xf…

C++笔记---string类(简单地使用)

1. string类介绍 string类是C标准库中给出的一种类类型&#xff0c;其目的是为了代替C语言中的字符串。 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是…

基于vue框架的车辆交易管理系统n5xwr(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,汽车品牌,汽车信息,汽车标签,特价汽车 开题报告内容 基于Vue框架的车辆交易管理系统开题报告 一、研究背景与意义 随着汽车市场的蓬勃发展和消费者购车需求的日益增长&#xff0c;车辆交易活动变得愈发频繁和复杂。传统的车辆交…

工业主板在轨道交通中的应用特点

工业主板在轨道交通中的应用特点主要体现在以下几个方面&#xff1a; 一、强大的处理能力 高性能处理器&#xff1a;工业主板通常搭载高性能的处理器&#xff0c;如飞腾D2000八核CPU等&#xff0c;这些处理器能够高效处理轨道交通系统中的大量数据&#xff0c;确保系统运行的…

Python实战: 写入 Excel 的多个 Sheet

更多内容 个人网站&#xff1a;孔乙己大叔 一、引言 在处理大型数据集或需要向非技术用户展示分析结果时&#xff0c;Excel 是一种广泛使用的工具。然而&#xff0c;手动创建包含多个 Sheet 的 Excel 文件既耗时又容易出错。幸运的是&#xff0c;Python 提供了自动化这一过程的…

51单片机仿真单只共阳级数码管循环显示0-9

51单片机仿真单只共阳级数码管循环显示0-9 单片机AT89C51控制7段共阳数码管的实验报告 一、实验目的 本实验旨在通过使用AT89C51单片机和7段共阳数码管&#xff0c;学习如何编写控制程序以及实现数码管的动态显示。通过此实验&#xff0c;加深对单片机基本原理和实际应用的理…