【问题标题】:SQL injection drop/delete from Hibernate HQL to MySQL从 Hibernate HQL 到 MySQL 的 SQL 注入删除/删除
【发布时间】:2015-04-10 05:36:28
【问题描述】:

在 Hibenate HQL 中,是否可以将表或数据库作为选择查询的嵌套部分删除?

例如,

select name,email,(delete from Group) from User where 1=1 

select name,email,(drop table Group) from User where 1=1 

或者在where子句之后:

select name,email from User where 1=1;drop table Group;

在 where 子句场景中,我得到如下错误:

org.springframework.orm.hibernate3.HibernateQueryException: unexpected char: ';' [ FROM com.party.Group WHERE name = ?  ORDER BY name ASC ;drop table User;]; nested exception is org.hibernate.QueryException: unexpected char: ';' [ FROM com.party.Group WHERE name = ?  ORDER BY name ASC ;drop table User;]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.QueryException: unexpected char: ';' [ FROM com.verecloud.nimbus4.party.Group WHERE name = ?  ORDER BY name ASC ;drop table User;]
    ... 24 more

要求是在选择查询中检查可能的 SQL 注入。

【问题讨论】:

    标签: java mysql sql spring hibernate


    【解决方案1】:

    SQL 注入需要结束一个语句,才能执行新的语句:

    select name,email,(;delete from Group;) from User where 1=1 
    select name,email from User where 1=1;drop table Group;
    

    如果您使用bind SQL parameters,则可以防止 SQL 注入。

    如果您动态生成 SQL SELECT(在运行时选择列),您应该使用 JPA CriteriajOOQ

    【讨论】:

    • 您可以删除 session.beginTransaction 和 session.getCurrentTransaction().commit 之间的表。执行所有选择和删除操作,然后提交会话。
    • 如果您使用绑定参数,客户端无法为您的 SELECT 语句提供 DELETE/DROP 恶意参数。对于动态构造的 SELECT 语句,您需要一个类型安全的查询构建器,例如 JPA Criteria。唯一继续进行的删除是您有意发出的。
    • huh!我的代码检查域以获取投影中提供的属性,因此不允许以前的查询。后者也不起作用,因为我在问题中指定它会引发异常。
    猜你喜欢
    • 2018-08-19
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多