关于动态SQL语句的UNION

时间:2017-01-05 16:05:16

标签: oracle plsql sql-injection web-application-firewall

我想要实现的目的基本上是这样的:

SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual';

我实际上是一个试图绕过Web应用程序防火墙的渗透测试人员,因此我确信这看起来很愚蠢/异常。基本上,我需要能够使用动态查询执行UNION以绕过过滤器。因此,在此示例中,您使用this function将字符串从Java传递到Oracle数据库。

我没有从数据库中获得有关我的查询有什么问题的任何反馈,也找不到任何做类似事情的人的文档。我需要一个简单的例子,其中我UNION使用简单的动态SQL字符串进行普通查询。

1 个答案:

答案 0 :(得分:2)

The execute immediate statement仅在PL / SQL块内有效。您不能将它与纯SQL混合使用。你也可以动态地(仅)运行PL / SQL,但是不要像你尝试过的那样将两者混合在一个语句中。

如果您运行在普通客户端中显示的内容,您会看到它抱怨:

Error starting at line : 1 in command -
SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual'
Error at Command Line : 3 Column : 1
Error report -
SQL Error: ORA-00928: missing SELECT keyword
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:

即使你传递的语句本身是动态执行的,你也会看到同样的错误:

BEGIN
  EXECUTE IMMEDIATE q'[SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual']';
END;
/

Error report -
ORA-00928: missing SELECT keyword
ORA-06512: at line 2
00928. 00000 -  "missing SELECT keyword"

进一步的考虑,虽然这里有点没有意义,但如果你没有通过选择变量来消费结果,那么动态查询就不会被实际执行(see the note here