用户为 where in 子句提供的子查询是不是存在注入攻击?

Posted

技术标签:

【中文标题】用户为 where in 子句提供的子查询是不是存在注入攻击?【英文标题】:Is there an injection attack with a user supplied subquery for a where in clause?用户为 where in 子句提供的子查询是否存在注入攻击? 【发布时间】:2017-05-27 15:39:32 【问题描述】:

我们有一项功能,允许用户使用 sql 语句过滤列表。

用户提供的语句本质上是这样使用的:

select * from table where id in (subquery) -- where subquery is given by the user

我尝试给它); delete from table; --delete from table returning id 但无济于事。 还有其他可能吗?我不担心用户看到数据,否则他们无法访问。

【问题讨论】:

1); delete from table; -- 是的,如果原始子查询使用 SQL 字符串进行插值,则它容易受到注入。正确清理用户输入,不会有问题。 @GSerg 谢谢你,“工作”。 我的一个程序有类似的设置(用户应该通过完整的where 子句,我必须信任它)。在我的设置中,我有一个登录用户,它拥有被引用的对象(因此没有人可以作为该用户登录)和另一个用户,在该用户下执行所有此类查询(只有一个权限:从该用户读取数据桌子)。在此设置下,我不必担心where 是否有效。如果它在任何意义上都无效,就会有一个或另一个例外;只有当它是针对该单个表的正确 where 时才会执行。 如果用户想出一个很好的笛卡尔连接where,这仍然存在 DoS 攻击的可能性,但是还有其他工具可以处理这个问题(例如 SQL Server 中的资源管理器)。 【参考方案1】:

您的问题是相互排斥的,因为您将 injection 与特定的 exploit 混淆了。

用户为 where in 子句提供的子查询是否存在注入攻击?

是的,当然。注入任意 SQL 代码的能力正是 SQL 注入。

我试过给它);从表中删除; -- 并从返回 id 的表中删除,但无济于事。

在大多数情况下,此特定查询不起作用。

还有其他可能吗?

是的,当然。主要是关于查看数据的用户,否则他们无法访问。

我不担心用户看到数据

所以请考虑清楚:您是关心整个 SQL 注入还是只关心特定子集。

【讨论】:

他们通常可以看到整个表格。子查询可以让他们过滤行。 不是看唯一的表,而是拥有对整个数据库的读取权限。 如何在子查询中工作?用户提供的唯一部分是子查询部分。我认为它不会泄漏数据。 @ThijsWouters 这么想成千上万的网站管理员,却发现信息被泄露了

以上是关于用户为 where in 子句提供的子查询是不是存在注入攻击?的主要内容,如果未能解决你的问题,请参考以下文章

与查询具有相同 WHERE 子句的子查询

SQLAlchemy - WHERE 子句中的子查询

在主查询的“IN”子句中使用逗号分隔列表的子查询结果

具有多个带有 AND 类型逻辑连接的 where IN 子句的配置单元查询

FROM中的子查询不在Oracle SQL中工作

在“where”子句中使用“in”运算符更新行