前言SQL注入是大家非常熟悉的一种攻击方式。MSSQL等)。但是缺少hibernate查询语言的相关资源。希望本文能为您在渗透测试时提供一条额外的路径。HQL查询不会直接发送到数据库,而是hibernate引擎解析和解释查询,然后将其转换为SQL。为什么这个细节很重要?因为错误信息的来源有两种,一种来自hibernate引擎,一种来自数据库。如果在HQL语法中发现了注入点,我们是不能直接使用通常的SQL利用方式来处理的。HQL有自己特定的语法,比SQL更受限制。例如,HQL没有办法直接查询未映射的表单,没有连接,没有创建简单延迟的函数,没有系统函数。幸运的是,俄罗斯程序员在几年前就找到了将HQL上下文转换为SQL上下文,然后直接与数据库通信的方法。接下来,进入正题。另外需要注意不同的数据库转义方式。以下案例使用MySQL数据库。开胃菜:HQL对原始请求/响应信息进行转义(注意POST主体中的GWT格式)并在参数后加上单引号。在返回的响应信息中可以看到服务端报错。竖线('|')、反斜杠('\')等特殊符号会破坏GWT结构,我们必须对这些数据进行编码。GWT格式特殊字符的处理:|=>!\=>\在转义HQL上下文之前,我们需要对涉及到的数据库做一些测试:在MySQL、MSSQL、Oracle等常用数据库中测试。最后payloadselected只能在MySQL下执行,然后我们将HQL上下文转义。将字符串\''从HQL上下文转换为MySQL上下文。在HQL查询的上下文中,通过附加另一个单引号来转义单引号,反斜杠仍然是普通的反斜杠。这与MySQL截然不同,后者使用反斜杠来转义单引号,而不是另一个单引号。因此,当Hibernate框架解析一条查询语句,而底层数据库是MySQL时,就变得很有趣了:Hibernate解析的语句:'orderInGroup'||'\''||(select1))--'//MySQL之后asastringpluspayload:'orderInGroup'||'\''||(select1))--'//string'\'',logical'or',selectquery下面的截图是成功执行字符串转义开胃菜后的payload,不妨打开胃口,从数据库中检索信息Dinner:BooleanBlindInjection我们案例中的注入点是在'orderby'查询部分,因为应用程序无法显示查询这时候,我们使用布尔盲注的思路。MySQL函数updatexml是一个很好的选择。如果它的第二个参数不是有效的XPath查询字符串,就会报错。如果XPath查询正确,则不返回任何值。updatexml(xml_target,xpath_expr,new_xml)重要的是只有在计算第二个参数(其中包含一个if子句)后才会抛出错误,即应用根据if子句判断是否返回一个错误。思路和SQL下的布尔值盲注是一样的,然后可以一个字符一个字符的提取数据。得到的完整值:最终解码得到[…]PROD_SELF[…]强烈推荐ORM2Pwn:ExploitinginjectionsinHibernateORMReferencesЭксплуатацияинъекцийвHibernateORMGWTRPCdataformatSQLBooleanBlindInjection思想分析ORM2Pwn:ExploitinginjectionsinHibernateORMHQLInjectioninMySQLExploitingaMySQLHQL注入HQLforpentestersHibernate:深入HQL学习
