嵌入 DML/DDL 作为子查询?

Embed DML/DDL as subquery?

在我的团队正在开发的应用程序中,所有用户都可以定义基于 SQL 的过滤器,这些过滤器是 SQL-select-return ID 的语句。 该语句由用户输入,然后作为子 select 子句嵌入到 insert ... select .. 语句中。

我对此确实有一种非常糟糕的感觉,我认为这是一个严重的安全问题,因为用户可能会找到一种方法来执行危险的任意 SQL 命令,例如 delete from....

限制或删除此功能肯定会违背客户的意愿。因此,我想要一个显示问题的概念验证。

因此我的问题是:
是否可以执行一些非常危险的语句来修改数据或使用 subselect 子句修改模式?

没有。那是不可能的。但是,也许他们可以输入 两个 语句,这些语句依次执行。如果第一部分是无害的 select,他们可以结束它(使用分号),并添加另一个有害的声明。这是否有效取决于该语句的执行方式,但请务必测试这种情况。

更好的是,让一个用户无权执行 dml 语句,甚至 ddl 语句,除了在那个 table 中插入。让该功能通过该用户帐户连接。这样一来,除了淹没 table 之外,他们永远不可能写出做有害事情的语句。

使用 resource manager 您甚至可以确保该用户不会对数据库造成很高的负载。

Is it possible to execute some really dangerous statements that modify data or schema modifying using a subselect clause?

简短回答:是!

示例: http://xkcd.com/327/

请阅读这些文章,并将它们呈现给您的"clients"。向他们表明,通过这样做,系统将更容易受到攻击,并且可以被利用。

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:23863706595353

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:31670728929866

http://www.securiteam.com/securityreviews/5DP0N1P76E.html

http://tkyte.blogspot.fi/2012/02/all-about-security-sql-injection.html