【问题标题】:Is SQL Injection possible when <>"'%;() are removed?删除 <>"'%;() 时是否可以进行 SQL 注入?
【发布时间】:2013-08-06 14:59:48
【问题描述】:

我刚刚偶然发现了一个同事的一些 SQL 代码(我们有一个“如果它没有破坏策略,请不要修复它”),用于登录过程。 name 变量由 JSP 中的输入字段提供。

//BAD CODING ALERT: DONT USE THIS CRAPPY CODE, YOU NAUGHTY COPY PASTERS!
Query q = em.createQuery("select object(u) from User as u where u.name = '" + name + "'");

除了服务器端对某些非法字符进行验证之外,name 变量上根本没有任何卫生设施:&lt;&gt;"'%;()(请注意这是单引号和双引号)

这可以被利用吗?如果是,那又如何?

如果不是单引号和双引号,可以这样做:blah' OR 'x'='x

【问题讨论】:

  • 您将如何处理名为 O'Reilly 的用户?
  • 强制 XKCD 链接 xkcd.com/327
  • 如果 em 代表 EntityManager,这可能意味着您可能正在使用 JPA。直接使用 JPA 还是 Hibernate 并不重要,那么他到底为什么要连接这样的 SQL 语句呢?请改用Query 提供的方法,并让框架管理清理。
  • @Olaf O'Reilly 不允许
  • @Terence:哦,真的吗? ;-)

标签: java sql hibernate jsp sql-injection


【解决方案1】:

您永远不应该通过字符串连接创建查询。使用query.setParameter("paramName",paramValue);

应该是这样的

Query q = em.createQuery("select object(u) from User as u where u.name =:name"); q.setParameter("name", "O'Reilly") 由于转义值,不可能进行 SQLInjections;

【讨论】:

  • 很好的重构,但看看我原来的问题。我问如何可以(或不能)利用以前的东西。请注意不是我,而是我的同事。
  • 我从未尝试在休眠查询中添加“OR 1=1”,但您可以尝试一下。 SQL 注入漏洞不太依赖于查询返回的返回结果(最坏的情况 - DB 转储或删除 xD),而是依赖于对结果集执行的操作。所以是的,在您的示例中,您始终可以提供 u.name 作为名称 - 这将返回数据库中具有名称的所有用户(名称不为空)。问题是,你以后用它做什么。也许您将返回的用户密码邮寄到提供的电子邮件,这里是所有密码 - 只是一个愚蠢的例子,但可能。
  • 输入 u.name(在原始 post sql 中)将被视为字符串而不是列
【解决方案2】:

回答我自己的问题......这是安全的,但并不像我自己所说的那样实用。

在投反对票之前,请阅读问题。或者以其他方式给出一个利用示例。

【讨论】:

  • 为什么要这么做?只是自找麻烦。以后 jr dev 复制粘贴编辑这段代码时你会怎么做?
  • 没有。我投了你一票,不是因为我同意,而是鼓励讨论。
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 2020-03-25
  • 1970-01-01
  • 2021-12-21
  • 2011-03-27
  • 1970-01-01
  • 2011-12-27
  • 2021-10-06
相关资源
最近更新 更多