三十八.WEB 漏洞-反序列化之 JAVA 全解(未完)
2022年 09月 05 日

BIGFISH

请添加图片描述

Java中的API实现:

  • 位置:
    • Java.io.ObjectOutputStream   java.io.ObjectInputStream
  • 序列化:
    • ObjectOutputStream类 --> writeObject()
    • 注意:
      • 该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
      • 按Java的标准约定是给文件一个.ser扩展名
  • 反序列化:
    • ObjectInputStream类 --> readObject()  
    • 注意:
      • 该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

序列化和反序列化

  • 序列化(Serialization):将对象的状态信息转换为字节序列(即可以存储或传输的形式)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
  • 反序列化:从存储区中读取该数据,并将其还原为对象的过程。

下方的特征可以作为序列化的标志参考:

  • 一段数据以rO0AB开头,基本可以确定这串就是JAVA序列化base64加密的数据。
  • 或者如果以aced开头,那么他就是这一段java序列化的16进制。

案例演示

  • 案例1:Java反序列化及命令执行代码测试
  • 案例2:WebGoat_Javaweb靶场反序列化测试
  • 案例3:2020-网鼎杯-朱雀组-Web-think_java真题复现

案例1:Java反序列化及命令执行代码测试

  • 1.使用writeObject()函数对person对象进行序列化,并把序列化后的字符串存入文件d:/person.txt中
    • 在这里插入图片描述
  • 2.用readObject()对文件d:/person.txt中序列化后的字符串乱码进行反序列化操作并返回对象person
    • 在这里插入图片描述
  • 3.命令代码执行测试
    • 在这里插入图片描述
  • 4.如果结合java反序列化+代码执行,将会给系统带来不可预料的危害。

案例2:WebGoat_Javaweb靶场反序列化测试

  • 靶场搭建
    • 1. 下载两个靶场文件
      • https://github.com/WebGoat/WebGoat/releases/download/v8.1.0/webgoat-server-8.1.0.jar
      • https://github.com/WebGoat/WebGoat/releases/download/v8.1.0/webwolf-8.1.0.jar
    • 2.下载jar环境
      • 需要注意的是webgoat需要jdk11或者以上的环境支持
    • 3.将下载的两个靶场文件复制到jdk11/bin
    • 4.在bin这个文件夹里运行cmd
    • 5.在cmd中输入执行命令: java -jar webgoat-server-8.1.0.jar
    • 6.打开地址:
      • 如果是默认地址和端口号直接使用浏览器打开localhost:8080/WebGoat
      • 第一次登录需要选创建一个账号
    • 7.如果需要修改ip和端口,在启动时候添加参数靶场搭建
    • java -jar webgoat-server-8.0.0.M14.jar --server.port=8000 --server.address=0.0.0.0
  • 案例演示
    • 1.打开地址链接:localhost:8080/WebGoat/start.mvc#lesson/WebGoatIntroduction.lesson
    • 2.下载工具jd-gui工具或者IDEA工具(推荐)
    • 3.打开webgoat-server-8.1.0.jar,分析源代码。
      • BOOT-INF/lib/insecure-deserialization-8.1.0jar/org/owasp.webgoat.deseriazation/serializationhelper
    • 4.反序列化这里可以执行对象中的代码
      • BOOT-INF/lib/insecure-deserialization-8.1.0jar/org/dummy.insecure.framework/vulnerabletaskholder
    • 5.本题目页面上的数据以rO0AB开头,可以确定这串就是JAVA序列化base64加密数据。但解密后没有发现什么
    • 6.题目还给出了一个接收序列化数据的表单,先分析一波,利用bp抓包
    • 7. 可以看到,表单提交的数据通过token接收,并发送到/InsecureDeserialization/task这个页面,可以通过/InsecureDeserialization/task找出对应的源码
    • 8.所以,页面接收的token是一段经过base64编码的序列化数据
    • 9.利用漏洞,所以我们在构造payload时,需要如下几步:
      • 构造含有命令(比如ipconfig)的对象-->序列化-->base64-->最终payload(rO0AB开头字符串)
      • 但是攻击时,还需要考虑回显问题,若系统不回显命令执行后的结果,即使我们攻击成功,也没用。因此我们一般需要构造反弹shell。
      • 这个过程挺复杂,手工的话,需要一个一个尝试,效率低且不一定成功。因此我们可以使用工具生成payload。
      • Java反序列化验证工具:https://github.com/frohoff/ysoserial/releases
      • 寻找ysoserial支持的插件,查找webgoat是否安装了对应的jar包
        • 在 ysoserial文件夹页面里打开cmd,输入命令 :java -jar ysoserial.jar
        • 按照ysoserial支持的插件,查找webgoat是否安装了对应的jar包,这里只有两个:
        • Hibernate和spring-core 但是spring-core的版本不一致,所以就选择Hibernate
        • 将Hibernate的jar包复制到ysoserial工具的目录下,jar包名字中必须是有core的,是插件的核心
        • 我这里是hibernate-core-5.4.9.Final.jar这个包,利用ysoserial生成payload,执行以下命令
        • java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial.jar ysoserial.GeneratePayload Hibernate1 calc.exe > token.bin
          • java -Dhibernate5 -cp hibernate-core-5.4.6.Final.jar; //表示hibernate5的插件
          • ysoserial.jar ysoserial.GeneratePayload Hibernate1 calc.exe > token.bin //生成Hibernate1插件反序列化漏洞的payload,执行calc.exe命令,将payload保存在token.bin文件中
          • payload生成了,但是表单接收的是经过base64编码的:采用python写的简单脚本对payloadbase64编码
    • 10.全选,复制粘贴到本题目输入框,点击提交,弹出计算器。

案例3:2020-网鼎杯-朱雀组-Web-think_java真题复现

  • CTFHub官网:https://www.ctfhub.com/\#/challenge
  • 参考:[网鼎杯 2020 朱雀组]Think Java_penson by 小乌的博客-CSDN博客
  • 打开题目
  • 1.注入判断,获取管理员帐号密码:
    • 根据提示附件进行javaweb代码审计,发现可能存在注入漏洞。
    • 另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试。
    • 数据库名:myapp,列名:name,pwd
    • 注入测试:
      • POST /common/test/sqlDict
      • dbName=myapp?a=' union select (select name from user)# 得到用户名
      • dbName=myapp?a=' union select (select pwd from user)# 得到密码
    • 注入路径
    • 注入参数
    • 构造请求,注入成功,得到账户密码
  • 2.接口测试
    • /swagger-ui.html接口测试:
      • {

        "password":"ctfhub_29588_13038",

        "username": "ctfhub"

        }
    • 登录成功返回数据:

    • 如下图所示,接口登录测试
    • 回显登录成功,返回token
    • 抓包如下
  • 3.回显数据分析攻击思路
    • JAVAWEB特征可以作为序列化的标志参考:
      • 一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
      • 或者如果以aced开头,那么就是这一段java序列化的16进制。
    • 此处登录成功时,发现回显的token是以rO0AB开头,猜测是一个JAVA序列化base64加密的数据。
    • 分析数据:
      • 先利用py2脚本base64解密数据
      • java_base64.py

相关链接

三十八.WEB 漏洞-反序列化之 JAVA 全解(未完)

请添加图片描述

Java中的API实现:

  • 位置:
    • Java.io.ObjectOutputStream   java.io.ObjectInputStream
  • 序列化:
    • ObjectOutputStream类 --> writeObject()
    • 注意:
      • 该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
      • 按Java的标准约定是给文件一个.ser扩展名
  • 反序列化:
    • ObjectInputStream类 --> readObject()  
    • 注意:
      • 该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

序列化和反序列化

  • 序列化(Serialization):将对象的状态信息转换为字节序列(即可以存储或传输的形式)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
  • 反序列化:从存储区中读取该数据,并将其还原为对象的过程。

下方的特征可以作为序列化的标志参考:

  • 一段数据以rO0AB开头,基本可以确定这串就是JAVA序列化base64加密的数据。
  • 或者如果以aced开头,那么他就是这一段java序列化的16进制。

案例演示

  • 案例1:Java反序列化及命令执行代码测试
  • 案例2:WebGoat_Javaweb靶场反序列化测试
  • 案例3:2020-网鼎杯-朱雀组-Web-think_java真题复现

案例1:Java反序列化及命令执行代码测试

  • 1.使用writeObject()函数对person对象进行序列化,并把序列化后的字符串存入文件d:/person.txt中
    • 在这里插入图片描述
  • 2.用readObject()对文件d:/person.txt中序列化后的字符串乱码进行反序列化操作并返回对象person
    • 在这里插入图片描述
  • 3.命令代码执行测试
    • 在这里插入图片描述
  • 4.如果结合java反序列化+代码执行,将会给系统带来不可预料的危害。

案例2:WebGoat_Javaweb靶场反序列化测试

  • 靶场搭建
    • 1. 下载两个靶场文件
      • https://github.com/WebGoat/WebGoat/releases/download/v8.1.0/webgoat-server-8.1.0.jar
      • https://github.com/WebGoat/WebGoat/releases/download/v8.1.0/webwolf-8.1.0.jar
    • 2.下载jar环境
      • 需要注意的是webgoat需要jdk11或者以上的环境支持
    • 3.将下载的两个靶场文件复制到jdk11/bin
    • 4.在bin这个文件夹里运行cmd
    • 5.在cmd中输入执行命令: java -jar webgoat-server-8.1.0.jar
    • 6.打开地址:
      • 如果是默认地址和端口号直接使用浏览器打开localhost:8080/WebGoat
      • 第一次登录需要选创建一个账号
    • 7.如果需要修改ip和端口,在启动时候添加参数靶场搭建
    • java -jar webgoat-server-8.0.0.M14.jar --server.port=8000 --server.address=0.0.0.0
  • 案例演示
    • 1.打开地址链接:localhost:8080/WebGoat/start.mvc#lesson/WebGoatIntroduction.lesson
    • 2.下载工具jd-gui工具或者IDEA工具(推荐)
    • 3.打开webgoat-server-8.1.0.jar,分析源代码。
      • BOOT-INF/lib/insecure-deserialization-8.1.0jar/org/owasp.webgoat.deseriazation/serializationhelper
    • 4.反序列化这里可以执行对象中的代码
      • BOOT-INF/lib/insecure-deserialization-8.1.0jar/org/dummy.insecure.framework/vulnerabletaskholder
    • 5.本题目页面上的数据以rO0AB开头,可以确定这串就是JAVA序列化base64加密数据。但解密后没有发现什么
    • 6.题目还给出了一个接收序列化数据的表单,先分析一波,利用bp抓包
    • 7. 可以看到,表单提交的数据通过token接收,并发送到/InsecureDeserialization/task这个页面,可以通过/InsecureDeserialization/task找出对应的源码
    • 8.所以,页面接收的token是一段经过base64编码的序列化数据
    • 9.利用漏洞,所以我们在构造payload时,需要如下几步:
      • 构造含有命令(比如ipconfig)的对象-->序列化-->base64-->最终payload(rO0AB开头字符串)
      • 但是攻击时,还需要考虑回显问题,若系统不回显命令执行后的结果,即使我们攻击成功,也没用。因此我们一般需要构造反弹shell。
      • 这个过程挺复杂,手工的话,需要一个一个尝试,效率低且不一定成功。因此我们可以使用工具生成payload。
      • Java反序列化验证工具:https://github.com/frohoff/ysoserial/releases
      • 寻找ysoserial支持的插件,查找webgoat是否安装了对应的jar包
        • 在 ysoserial文件夹页面里打开cmd,输入命令 :java -jar ysoserial.jar
        • 按照ysoserial支持的插件,查找webgoat是否安装了对应的jar包,这里只有两个:
        • Hibernate和spring-core 但是spring-core的版本不一致,所以就选择Hibernate
        • 将Hibernate的jar包复制到ysoserial工具的目录下,jar包名字中必须是有core的,是插件的核心
        • 我这里是hibernate-core-5.4.9.Final.jar这个包,利用ysoserial生成payload,执行以下命令
        • java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial.jar ysoserial.GeneratePayload Hibernate1 calc.exe > token.bin
          • java -Dhibernate5 -cp hibernate-core-5.4.6.Final.jar; //表示hibernate5的插件
          • ysoserial.jar ysoserial.GeneratePayload Hibernate1 calc.exe > token.bin //生成Hibernate1插件反序列化漏洞的payload,执行calc.exe命令,将payload保存在token.bin文件中
          • payload生成了,但是表单接收的是经过base64编码的:采用python写的简单脚本对payloadbase64编码
    • 10.全选,复制粘贴到本题目输入框,点击提交,弹出计算器。

案例3:2020-网鼎杯-朱雀组-Web-think_java真题复现

  • CTFHub官网:https://www.ctfhub.com/\#/challenge
  • 参考:[网鼎杯 2020 朱雀组]Think Java_penson by 小乌的博客-CSDN博客
  • 打开题目
  • 1.注入判断,获取管理员帐号密码:
    • 根据提示附件进行javaweb代码审计,发现可能存在注入漏洞。
    • 另外有swagger开发接口,测试注入漏洞及访问接口进行调用测试。
    • 数据库名:myapp,列名:name,pwd
    • 注入测试:
      • POST /common/test/sqlDict
      • dbName=myapp?a=' union select (select name from user)# 得到用户名
      • dbName=myapp?a=' union select (select pwd from user)# 得到密码
    • 注入路径
    • 注入参数
    • 构造请求,注入成功,得到账户密码
  • 2.接口测试
    • /swagger-ui.html接口测试:
      • {

        "password":"ctfhub_29588_13038",

        "username": "ctfhub"

        }
    • 登录成功返回数据:

    • 如下图所示,接口登录测试
    • 回显登录成功,返回token
    • 抓包如下
  • 3.回显数据分析攻击思路
    • JAVAWEB特征可以作为序列化的标志参考:
      • 一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
      • 或者如果以aced开头,那么就是这一段java序列化的16进制。
    • 此处登录成功时,发现回显的token是以rO0AB开头,猜测是一个JAVA序列化base64加密的数据。
    • 分析数据:
      • 先利用py2脚本base64解密数据
      • java_base64.py

相关链接

赞 (0)

猜您想看

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论