57 代码审计-JAVA项目框架类漏洞分析报告

news2024/11/26 0:48:39

目录

      • 过滤器及拦截器相关区别解释
      • Struts2-016远程代码执行漏洞分析-黑盒流程
      • SpringBoot-SpEL表达式注入漏洞分析-白盒思路

在这里插入图片描述

过滤器及拦截器相关区别解释

Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

简单来说这两个的作用是没有区别的,但是两个的申明调用有些小区别,但是这个我们可以不用去理解它

最重要的要记住他们的执行顺序: 先filter 后 interceptor
另外在不同框架中有的是自带有的是需要自写,具体可以查看开发资料。

不是说每个框架都有filter 和 interceptor,框架本身自带了一些,但是有些自带的满足不了他的需求,比如我们要对注入进行过滤,这个时候自带的没有这个东西,就需要自己写;有些无关紧要的,例如字体编码、汉字的正常显示,像这些东西一般都有自带,那这种我们就忽略不计,我们主要看的是他有没有一些对安全攻击的防护,有些是有的,有些是需要自己写的,需要自己去配置

Struts2-016远程代码执行漏洞分析-黑盒流程

Struts2目前已经脱离主流了,在传统企业用一点,目前主流的是SSM,Spring、Spring MVC、MyBatis

我们先看Filter和Interceptor,再决定后面代码会不会受到Filter和Interceptor的影响

框架特性就是框架自身的写法,有那些独有的东西,因为这些特有的东西,可能会出安全问题,框架代码审计之所以难,是因为执行流程复杂

术语解释:

1、HttpServletRequest 请求信息
2、ActionContextCleanUp 不重要,现在貌似不用了
3、Other filters 不重要,现在貌似不用了
4、Filter Dispatcher 过滤器,这个应该是最底层的过滤器
5、ActionMapper Struts2中主要检测请求信息是否需要Struts2处理
6、ActionProxy 一个中间层,就是可以调用其他类什么的
7、ConfigurationManger 负责将Struts.xml配置文件映射到内存中去
8、Struts.xml Struts.xml配置文件需要程序员填写
9、ActionInvocation 包含四个属性分别获取前端传递的值,action,struts.xml信息,其他一些数据。
10、Interceptor 拦截器
11、Tag Subsystem Struts2自带标签库 没用
12、Templete struts2的前端模板,没用吧,不清楚
13、HttpServletResponse 响应用户的类

首先我们看配置信息这里,看有没有过滤器、拦截器、引用框架信息这些东西
我们看到有引用struts2框架
在这里插入图片描述
看pom.xml也能看到
在这里插入图片描述
这边是过滤器运行的主要地方,访问.action后缀文件的时候,就会触发过滤器的代码
在这里插入图片描述
也就是说访问这个地址时,会触发过滤器
在这里插入图片描述
在这里插入图片描述
下断点,点击调式,我们看一下代码的执行流程
在这里插入图片描述
每下个文件就会执行流程
在这里插入图片描述
这个就是我们刚才指向过滤器的地址
在这里插入图片描述
这个payload就是测试漏洞的,输出OK,说明我们文件写入成功
在这里插入图片描述
但是这个代码没有触碰到jsp这里来
在这里插入图片描述
我们去掉post请求或者把前面的东西改一下,就可以触碰到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是因为代码的设置,只要是这四个参数,就可以不用触碰代码
在这里插入图片描述
原因是下面这个

官方描述

Struts2的DefaultActionMapper支持一种方法,可以使用’action:",“redirect”,"redirectAction:“对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的 struts2中,没有对"action:”,“redirect:”,"redirectAction:"等进行处理,导致ongl表达式可以被执行。
因为没有经过rasp.jsp,所以过滤器没有触发到从而导致了命令执行
我们要搞清楚执行流程,执行流程是用来可以尝试绕过过滤器和拦截器的一种方式,因为有时候它满足一些规则之后,就会跳出过滤器和拦截器,走其它地方

该漏洞利用st2特性: 1.路由 2.OGL表达式 3.执行流程

用已知漏洞去分析源码有没有安全问题,就是看它框架的版本是否在网上有公开漏洞
在这里插入图片描述

断点调试查看执行代码文件分析

根据st2框架执行流程测试:对比上图
未触发关键字-断点文件-调试到过滤器
触发关键字-断点文件-未调试到过滤器

漏洞其实是执行流程上的问题,配合struts2的特性来实现绕过

OGNL介绍

简称OGNL,对象导航图语言 (Object Graph Navigation Language) ,是应用于Java中的一个开源的表达式语言 (Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

这个表达式我们不用去学,每个框架里面都有一个表达式,OGNL是Struts2框架里面特有的表达式

源文件是jsp,访问显示action,是因为action框架可以改变后缀
在这里插入图片描述

SpringBoot-SpEL表达式注入漏洞分析-白盒思路

Spring Expression Language (缩写为SpEL)是一种强大的表达式语言。在 Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。

SpEL表达式可以理解为php的eval,将里面的代码以脚本执行,它就会将代码中你传入的一些数据以java去识别数据去执行

分析审计思路
获取配置信息:
1.过滤器(拦截器),框架包,触发请求,框架特性 (ogn1,路由等)
2.打开对应st2对应过滤器,配合st2路由配置文件,解读:
分析开源框架的漏洞还是从其源码入手,问题出在了DefaultActiionMapper上,这个类主要是用来处理一些灵活的URL调用,比如处理Action中动态调用方法的形式,如:
我们看SpringBoot框架源码
在这里插入图片描述
我们并没有看到配置文件,我们就去看pom.xml文件,看到SpringBoot框架是1.3.0版本的
在这里插入图片描述
我们去网上搜这个版本的SpringBoot框架,发现这个版本存在漏洞
在这里插入图片描述
我们把项目启动起来
在这里插入图片描述
访问/SpELVuIRCE.php地址的时候,指向的就是spel.jsp,接收id
在这里插入图片描述
在这里插入图片描述
JDBC和DAO模块是用来处理数据库的
在这里插入图片描述
在这里插入图片描述
由于这个网站在访问信息显示页面,这个数据必定在数据库里面
在这里插入图片描述
这个地方跟我们之前讲过的sql注入有点问题,不是采用预编译的写法
在这里插入图片描述
明显有注入点,我们采用数据库监控工具就可以判断
在这里插入图片描述
按照正常来讲,我们访问这个文件,你即使这样写,有自身过滤器的话,也会进行拦截

这个拦截器需要它自己写的,也就是说sping框架里面没有写拦截器、没有去配置它的话,等同于说没有任何防护,除了这个防护代码是写在下面
在这里插入图片描述
struts2
已知漏洞: 找框架自身的版本,利用漏洞库去确定漏洞
未知漏洞: 执行流程,过滤器,拦截器,框架特性
在网上找不到这个漏洞,或者说这个漏洞没有在网上存在过,就是俗称的0day

验证:
采用断点调试,确定.action文件断点后,无法拦截执行请求,说明满足路由规则请求方法后跳出过滤拦截器,绕过实现ongl表达式漏洞

spring
已知漏洞: 找框架自身的版本,利用漏洞库去确定漏洞
有spel表达式注入漏洞-未知漏洞测试
从自身源码分析到文件sql语句中有注入漏洞,尝试成功 (未发现过滤器及拦截器)

spring自带的过滤器和拦截器有,但是自带的过滤器和拦截器只是为了网站的访问和异常进行修复,并不会对漏洞进行防护,你针对spring框架进行漏洞分析的时候,还是要看过滤器和拦截器是自带的还是写的

总结:
1.先确定源码中是否存在框架-
执行流程,特性(表达式,拦截器或过滤器自带或自写?)
已知的框架版本漏洞 利用
2.确定源码中是否存在过滤器 - 自带或引用或自定义拦截规则
3.过滤器中怎么触发,过滤器规则

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

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

相关文章

gitattributes配置文件的作用

0 Preface/Foreword Git版本管控工具功能强大,在使用过程中,在多人合作的项目开发过程中,经常会遇到提交代码时出现的warning提醒,尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号(\n)&…

Dash中 基本的 callback 5

app.callback 在Dash中,app.callback 被用于创建交互性应用程序,它用于定义一个回调函数,该函数在应用程序中发生特定事件时被触发。回调函数可以修改应用程序的布局或更新图表等内容,从而实现动态交互。 下面是一个简单的 app.…

LaTex详细安装及配置(Windows)

文章目录 引言LaTeX简介优势与应用领域 安装环境安装texlive下载texlive安装 编辑器安装texstudio下载texstudio安装 环境配置 使用第一个LaTex文档新建文件编程查看 效果 结语 引言 在当今信息技术高度发达的时代,文档的编辑和排版是我们日常工作和学习中不可或缺…

JavaScript中的prototype和_proto_的关系是什么

JavaScript中的prototype和_proto_的关系是什么 __proto__ 是 JavaScript 中对象的一个内部属性,它指向该对象的原型。JavaScript 中每个对象都有一个 __proto__ 属性,通过它可以访问对象的原型。prototype 是函数对象特有的属性,每个函数都…

蓝桥杯 1223 第 2 场 小白入门赛

蓝桥小课堂-平方和 模拟 1 2 2 2 3 2 ⋯ n 2 n ⋅ ( n 1 ) ⋅ ( 2 n 1 ) 6 1^22^23^2\cdotsn^2\dfrac{n\;\cdot\;(n 1)\;\cdot\;(2n1)}{6} 122232⋯n26n⋅(n1)⋅(2n1)​。 write(n * (n 1) * (n * 2 1) / 6);房顶漏水啦 m a x ( 最大的行 − 最小的行 , 最大的列 −…

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一: 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程,然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二:DevC 多线程创建…

[Netty实践] 简单WebSocket服务实现

目录 一、介绍 二、依赖导入 三、基础类准备 四、Handler实现 五、WebSocketChannelInitializer实现 六、WebSocketServer实现 七、前端实现 八、测试 九、参考链接 一、介绍 关于WebSocket此处不进行过多介绍,本章主要着重通过Netty实现WebSocket通信服务…

在线客服系统:解决常见问题的实用工具与解决方案

市场得不断发展促使着消费者服务意识的觉醒,越来越多的消费者在购买产品的时候不仅看产品的功能、外观、性能,还关注品牌的服务质量。在线客服系统的出现帮助企业解决了客户服务难的问题。接下来,我们具体聊一聊在线客服系统能解决哪些问题&a…

每日一题——LeetCode888

方法一 个人方法: 交换后要达到相同的数量,那么意味着这个相同的数量就是两个人总数的平均值,假设A总共有4个,B总共有8个,那么最后两个人都要达到6个,如果A的第一盒糖果只有1个,那么B就要给出6…

铁山靠之——HarmonyOS基础 - 1.0

HarmonyOS学习第一章 一、HarmonyOS简介1.1 安装和使用DevEco Studio1.2 环境配置1.3 项目创建1.4 运行程序1.5 基本工程目录1.5.1 工程级目录1.5.2 模块级目录1.5.3 app.json51.5.4 module.json51.5.5 main_pages.json 二、TypeScript快速入门2.1 简介2.2 基础类型2.2.1 布尔值…

通过 Nginx 代理实现网页内容替换

突发奇想,用 Nginx 代理一个网站,把网站的一些关键字替换掉,蛮有意思的。 如下图: 一、编译安装 Nginx 一般 Nginx 中不包含 subs_filter 文本替换的模块,需要自己手动编译安装,步骤如下。 克隆 subs_fi…

linux cpu调度分析

一、cpu调度调试方法 echo 0 > /sys/kernel/debug/tracing/tracing_on echo > /sys/kernel/debug/tracing/trace echo 30720 > /sys/kernel/debug/tracing/buffer_size_kb echo nop > /sys/kernel/debug/tracing/current_tracer echo sched_switch sched_wakeup s…

移除石子使总数最小(LeetCode日记)

LeetCode-1962-移除石子使总数最小 题目信息: 给你一个整数数组 p i l e s piles piles ,数组 下标从 0 0 0 开始 ,其中 p i l e s [ i ] piles[i] piles[i] 表示第 i i i 堆石子中的石子数量。另给你一个整数 k k k ,请你执行下述操作…

Win11右键菜单显示全部的方法

Win11右键菜单显示全部的方法:1. 用鼠标右键点击“开始”按钮(或者按WinX键),选择点击 “Windows 终端(管理员)”。 2.在终端应用程序里粘贴这串代码【reg.exe add “HKCU\Software\Classes\CLSID{86ca1aa…

实现一个最简单的内核

更好的阅读体验,请点击 YinKai s Blog | 实现一个最简单的内核。 ​ 这篇文章带大家实现一个最简单的操作系统内核—— Hello OS。 PC 机的引导流程 ​ 我们这里将借助 Ubuntu Linux 操纵系统上的 GRUB 引导程序来引导我们的 Hello OS。 ​ 首先我们得了解一下&a…

burpsuite与sqlmap联动(sqlipy配置)

首先我们需要在burpsuite的 扩展-选项 里配置两个路径: 第一个路径为 jython-standalone-2.7.3.jar 的路径 这个jar文件我们需要自己下载,下载地址:https://www.jython.org/ 点击 download 点击 Jython Standalone 下载好之后将这个jar文件…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

基于Python的音乐数据可视化与推荐系统开发

基于Python的音乐数据可视化与推荐系统开发 导言: 音乐是人们生活中不可或缺的一部分,而对于音乐数据的收集、分析和可视化正逐渐成为技术领域的热点。本文介绍了一款基于Python开发的音乐数据可视化与推荐系统,通过爬取千千音乐网站的数据&a…

C# 实现虚拟数字人

随着Ai技术的提升和应用,虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小,可以让数字人可以在电脑屏幕各个位置显示: 虚拟数字人素材: 虚拟数字人(实际有语音&am…

双向A*算法-python

GitHub - LittleFox99/B_A_star: Bidirectional A Star 其中a,b分别为双向A*搜索的权重 #-*- coding:utf-8 -*- # Time : 2020/11/11 1:21 下午 # Author : LittleFox99 # File : a_star.py # 参考: # https://blog.csdn.net/lustyoung/article/d…