【发布时间】:2014-07-04 11:10:54
【问题描述】:
也许我在 SQL 方面没有足够的创造力或知识......但看起来没有办法在 SELECT 中执行 DROP TABLE 或 DELETE FROM 而无法启动新语句。
基本上,我们的代码库有一些巨大的、“不够强大”的 SQL 生成组件,它从不使用预准备语句,而我们现在有一个与这个遗留组件交互的 API。
现在我们可以通过追加到查询的末尾来修改查询,但是无法插入任何分号。因此,我们可以这样做:
/query?[...]&location_ids=loc1')%20or%20L1.ID%20in%20('loc2
这会导致这个
SELECT...WHERE L1.PARENT_ID='1' and L1.ID IN ('loc1') or L1.ID in ('loc2');...
这只是一个例子。
基本上,我们可以在任何/大多数生成的 SQL 查询的末尾附加几乎任何内容,而不是添加分号。
关于这可能会如何造成一些损害的任何想法?您可以在删除或删除表的 SQL 查询末尾添加一些内容吗?或者创建一个非常荒谬的查询,它占用了所有 CPU 并且永远不会完成?
【问题讨论】:
-
关于 SQL 注入的话题很多,您不妨阅读一些以前的搜索结果by clicking here 或手动搜索。
-
您声明查询字符串添加的结果将导致 "SELECT...WHERE L1.PARENT_ID='00000000-0000-0000-0000-000000000001' 和 L1.ID IN ('loc1 ') 或 L1.ID in ('loc2');"但如果你注意到末尾有一个分号。分号是怎么来的?
-
SQL 组件将其添加到末尾。
-
所以如果我构造这样的查询字符串 /query?[...]&location_ids=loc1');我在查询字符串中输入的分号会发生什么变化?
-
服务器抛出异常。
com.company.nbi.exceptions.ApplicationException: 0x1F615:EXCEPTION OCCURRED RUNNING SQL QUERY: org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near "')"
标签: sql postgresql security sql-injection