CC1 补充(LazyMap)

slug
series-status
status
summary
date
series
type
password
icon
tags
category

Ysoserial

  • 上文记了一条CC1利用链,但是如果我们去看Ysoserial这个工具里的CC1利用链的话,会发现这里的利用链和我们前文讲的不完全一样:
notion image
  • 我们前文使用的那条CC1利用链的关键节点如下:
notion image
  • 可以看到在这个工具里的利用代码中将我们用到的TransformedMap换成了LazyMap,然后前边的注解代理处理器的用法还是一样的。

CC1-LazyMap分析

LazyMap分析

  • 在Yso的介绍里,可以看到他们使用了LazyMap的get方法,我们这里看一下这个get方法里具体做了什么:
notion image
  • 这里可以看到这里的get方法其实是调用了factory的transform方法,而这里的factory对象其实来自于LazyMap的构造方法,也就是说这个对象其实也是可控的,那么也就验证了这个可以替换掉原有的TransformedMap:
notion image
  • 接下来我们就要去找一下注解代理处理器类的readObject方法调用了什么方法调用了这个get方法,根据Yso的介绍其实是调用的AnnotationInvocationHandler的invoke方法,也就是动态代理的invoke方法:
notion image
如果对于动态代理不太熟悉的话可以参考这个视频:https://www.bilibili.com/video/BV16h411z7o9?p=3
  • 然后既然是同一个代理处理器的invoke方法,那只要调用这个代理的任意一个方法即可触发这个invoke方法。
  • 而具体调用的什么方法呢,恰好,在readObject方法里它又调用了一个无参方法刚好触发这个invoke方法:
notion image
  • 因此,这条CC1的利用代码如下:
  • 效果
notion image
  • 补充上这一条CC1后我们的关键节点图如下:
notion image
  • 但是无论是这次讲到的这条CC1还是前文的那条CC1都存在一个问题,就是对JDK版本要求再8u65以下,因为在这之上的版本对AnnotationInvocationHandler类的readObject方法做了一定的调整:
notion image
  • 可以看到这里直接去掉了对setValue方法的调用,直接在最头部的地方断掉了这条利用链,之前我们的两种利用代码也就没法用了,但是在后边我们讲到的CC6则可以避开JDK的限制从HashMap入手解决这个问题。
参考视频:https://www.bilibili.com/video/BV1yP4y1p7N7
Loading...

尚未开始
更新中
近期核心
已完结
已弃更

© River 2021-2025