【问题标题】:HQL injection with Postgresql使用 Postgresql 进行 HQL 注入
【发布时间】:2020-01-16 09:55:56
【问题描述】:

我正在尝试了解 HQL 注入的工作原理,但我需要帮助。 我使用以下 json 向服务器发送 HTTP POST 请求:

{
    "status":"COMMUNICATION",
    "planning": {
    "from": "01-20-2013",
    "to": "11-12-2015"
    }
}

我知道可以在 "status" 参数的末尾注入欺诈性请求,因为当我用一个简单的引号(例如:"status":"COMMUNICATION'")结束时,服务器会返回一个请求出现休眠错误:


{
    "exception": "org.springframework.dao.InvalidDataAccessApiUsageException", 
    "error": "Internal Server Error", 
    "message": "org.hibernate.QueryException: expecting ''', found '<EOF>' [SELECT com FROM com.company.CorRequest as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'' AND com.scheduledDate > to_timestamp('01-20-2013','MM-dd-yyyy HH24:MI') AND com.scheduledDate <= to_timestamp('11-12-2015','MM-dd-yyyy HH24:MI')]; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: expecting ''', found '<EOF>' [SELECT com FROM com as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'' AND com.scheduledDate > to_timestamp('01-20-2013','MM-dd-yyyy HH24:MI') AND com.scheduledDate <= to_timestamp('11-12-2015','MM-dd-yyyy HH24:MI')]", 
    "path": "/v1/comuni/", 
    "timestamp": 1579167902428, 
    "status": 500
}

当我注入"COMMUNICATION')--" 时,我得到了整个表,但我不能做任何其他事情,你有什么想法吗?

【问题讨论】:

  • 您是否正在考虑如何在服务器端处理这个问题,或者如何防止客户端出现错误请求?
  • 如何在服务器端处理这个问题,因为我想尝试使用数据库提取进行 POC。
  • 我建议你看看这个:stackoverflow.com/questions/31314209/… - 你会在那里找到一个链接到software-security.sans.org/developer-how-to。虽然没有在该站点上处理 Postgres - 应该适用相同的原则。
  • 我确实遇到过这些资源,但我无法脱离表的上下文,存在 SQLMAP 演示 (youtube.com/watch?v=6WeUxAmYgHQ) 但我不知道为什么它没有当我发动攻击时工作。

标签: json postgresql hql sql-injection


【解决方案1】:

注入总是遵循相同的攻击路径。让我们看看基础知识。

  1. 向服务提交恶意数据
  2. 服务将此数据放入某种结构(XML、HTML、SQL、LDAP 查询、shell 命令等...)
  3. 如果服务有漏洞,可以突破数据范围,修改结构本身,给你XML/HTML/SQL/LDAP/command等注入

为了伟大的overview of injections, read this post

看看你的例子,这就是正在发生的事情。

  1. 您提交 COMMUNICATION)'-- 作为恶意输入
  2. 您的服务使用 HQL 创建如下 SQL 查询:SELECT com FROM com.company.CorRequest as com where com.corCommunicationId &gt; 0 AND com.status = 'COMMUNICATION'--' AND ...
  3. 您突破了com.status 的数据范围,并且能够通过注释掉com.status = COMMUNICATION 之后的所有内容来修改查询本身的结构

这就是为什么您要恢复整个表格的原因。

那么如何从不同的表中提取数据呢?以下是sqlmap supports 的一些技巧。最简单的方法是使用UNION query-based注入:提交UNION ALL SELECT xy FROM different_table作为恶意输入,应该可以查询different_table并提取数据。

现在,当然,您的设置是独一无二的,我不知道围绕查询运行的代码。某些应用程序逻辑可能会隐藏此缺陷并使其更难/不可能被利用。您提供的示例应该是足以保证修复的 POC。我写了一篇短文 about trusting incoming data 以及你应该有的心态。

如果您真的想尝试使用 sqlmap 提取数据,我建议您查看arbitrary injection point feature 的文档。

根据您提供的信息猜测,注入点是这样的:COMMUNICATION)'*

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2014-01-15
    • 2019-07-09
    • 2019-02-27
    • 2012-02-11
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多