xxx系统存在HQL注入漏洞
漏洞名称 |
HQL注入漏洞 |
漏洞地址 |
|
漏洞等级 |
高危 |
漏洞描述 |
Hibernate是一类O/R mapping框架,其内部允许使用一般数据库查询语言或者Hibernate查询语言,同时对数据库进行增、删、改、查操作。 Hibernate查询语言注入指在Hibernate中程序没有细致地过滤用户输入的数据导致攻击数据植入程序而被当作代码执行。 我们知道,只有在知晓数据库名称及数据库列名称的前提下,方可对数据库里面的记录进行查询。可是,HQL查询语言一般并不支持union查询,所以也就没法获取数据库名称及数据库列名称了,自然也就没法对数据库里面的记录进行查询了。因此,只要通过某种方法知晓数据库名称及数据库列名称,Hibernate查询语言注入就可成功。 |
漏洞成因 |
在Hibernate中程序没有细致地过滤用户输入的数据导致攻击数据植入程序而被当作代码执行。 |
漏洞危害 |
可能导致数据泄露或数据破坏,缺乏可审计性,甚至导致攻击者完全控制服务器。 |
修复方案 |
1.对参数名称进行绑定: Query query=session.createQuery("from User user where user.name=:customername and user:customerage=:age"); query.setString("customername",name); query.setInteger("customerage",age); 2.对参数位置进行邦定: Query query=session.createQuery("from User user where user.name=? and user.age =?"); query.setString(0,name); query.setInteger(1,age); 3.setParameter()方法: String hql="from User user where user.name=:customername"; Query query=session.createQuery(hql); query.setParameter("customername",name,Hibernate.STRING); 4.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); }。 |
测试过程 |
某站userIdCard参数存在Hibernate查询语言注入,攻击者进入系统登录页面,单击忘记密码并输入123',如图1所示。 接下来,使用Burp Suite截取找回密码请求数据包,如图2所示。 攻击者对截取的数据包进行安全测试,Web服务器返回图3所示的信息。
攻击者直接使用sqlmap验证该HQL注入,网站后台数据库为Oracle。 |
复测情况 |
未修复 |
测试人员 |
测试人员1 测试人员2 |
原文始发于微信公众号(利刃信安):【每天一个漏洞报告19】HQL注入漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论