首页 > 编程语言 >一文教你学会java代码审计

一文教你学会java代码审计

时间:2024-09-04 20:52:00浏览次数:10  
标签:审计 语句 java 编译 sql 文教 asc 漏洞 SQL

《网安面试指南》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 参数是否为空

图片

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

标签:审计,语句,java,编译,sql,文教,asc,漏洞,SQL
From: https://blog.csdn.net/persist213/article/details/141903680

相关文章

  • 记一次代码审计之nbcio-boot从信息泄露到Getshell
    《Java代码审计》http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484219&idx=1&sn=73564e316a4c9794019f15dd6b3ba9f6&chksm=c0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene=21#wechat_redirect一、项目简介NBCI......
  • java 使用WebSocket 功能实现
    java使用WebSocket功能实现我整理的一些关于【架构设计】的项目学习资料+视频(附讲解~~)和大家一起分享、学习一下: https://d.51cto.com/bLN8S1实现Java直播弹幕功能1.引言本文将教会一位刚入行的小白如何实现Java直播弹幕功能。直播弹幕是指在直播过程中,观众可以发送实时弹幕......
  • 二分查找:手拿把掐!------Java代码实现
    “没有天赋,那就不断重复.”文章目录前言文章有误敬请斧正不胜感恩!模板一:(最基本的)**左闭右闭:**[left,right]模板二:**左闭右开区间模板:**区间:左闭右开[left,right):模板三:开区间模板:(left,right)循环不变量:二分查找易错点:做题经验:疑问及解答:我自己的......
  • JAVA基础之四-函数式接口和流的简介
    自从J8开始,对于开发JAVAEE应用的工程师而言,函数式接口会常常接触,某种程度上有点不可绕过。这是因为在绝大部分企业中都会使用Spring来开发JAVAEE,而Spring在它的实现中越来越多地使用上函数式编程。如果我们阅读它的源码,函数式编程是绕不过去的。 函数式编程有其好处,这个好处......
  • 从初识Redis到精通Redis,一份Java程序员必备Redis实战文档分享
    本文深入浅出的介绍了Redis的五种数据类型,并通过多个实用示例展示了Redis的用法。除此之外还讲述了Redis的优化方法和扩展方法。一共由三个部分组成,第一部分对Redis进行了介绍,说明了Redis的基本使用方法、它拥有的5种数据结构以及操作5种数据结构的命令,并详解了如何使用R......
  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
    BlockingQueueBlockingQueue是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自Queue接口。BlockingQueue中的元素采用FIFO的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作,当前线程在队列满或空的情况下会被阻塞,直到被唤醒或超时。常用的......
  • 基于Javaweb实现的物流管理系统设计与实现(源码+数据库+论文+部署+文档+讲解视频等)
    文章目录1.前言2.系统演示录像3.论文参考4.代码运行展示图5.技术框架5.1SpringBoot技术介绍5.2Vue技术介绍6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.找我做程序,有什么保障?12.联系我们1.前......
  • 基于Java实现的校园外卖点餐管理系统设计与实现(源码+数据库+部署+文档+讲解视频等)
    文章目录1.前言2.系统演示录像3.论文参考4.代码运行展示图5.技术框架5.1SpringBoot技术介绍5.2Vue技术介绍6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.找我做程序,有什么保障?12.联系我们1.前......
  • Java软件架构师-25个关注点
        Java软件架构师需要掌握的25个关注点,包括微服务、云原生应用、反应式编程和区块链技术等。其中,采用微服务架构是当前Java架构师必须具备的能力之一,因为它能够帮助设计出更加灵活、可扩展和可靠的系统。此外,一些与微服务相关的技术和工具,如SpringBoot、Quarkus和OpenShif......
  • Java中抽象类、接口、实现类的区别
    接口、抽象类、实现类的区别接口接口中的所有属性都必须是常量(即被publicstaticfinal修饰)。接口中的所有方法都必须是抽象方法(在Java8及以后,接口中可以包含默认方法和静态方法,但这些方法也必须有具体实现或逻辑,只是不强制要求实现类实现它们)。接口不能被实例化。接口支......