哪里可以获得二阶SQL注入的资源和演示?

时间:2012-10-10 23:48:17

标签: sql sql-injection

我一直在互联网上搜索二阶SQLi的演示,但我还没有找到一个。许多网站并没有真正详细解释它的工作原理。 我需要做一个简短的演示,我一直在练习使用Mutillidae。任何人都能引导我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:0)

Google搜索“二阶sql注入”会出现一些或多或少相关的二阶SQL注入解释,具有不同程度的细节(正如您所说)。

基本思想是数据库存储来自用户的一些文本,这些文本稍后被合并到SQL语句中 - 但是文本在重用之前没有得到充分的清理。

考虑一个允许用户针对数据库创建用户定义查询的应用程序。一个简单的例子可能是错误跟踪系统。一些用户定义的查询属性可能是简单的条件,例如“bug status is”closed“'。这可以通过查看存储的查询定义来编码:

CREATE TABLE UserDefinedQuery
(
    ...user info...,
    bug_status    VARCHAR(20),
    ...other info...
);

SELECT ..., bug_status, ...
  INTO ..., hv_bug_status, ...
  FROM UserDefinedQuery
 WHERE bug_status IS NOT NULL
   AND ...other criteria...

其中hv_bug_status是一个主机变量(PHP,C,无论你使用什么语言),都持有错误状态标准。

如果此值为= 'closed',则生成的SQL可能包含:

SELECT *
  FROM Bugs
 WHERE status = 'closed'
   AND ...other criteria...

现在假设当用户定义他们的查询时,他们写了:

= 'open' or 1=1

这意味着生成的查询现在看起来像:

SELECT *
  FROM Bugs
 WHERE status = 'open' or 1=1
   AND ...other criteria...

OR的存在会显着改变查询的含义,并会显示各种其他记录,而这些记录不是用户想要查看的记录。这是bug查询应用程序中的一个错误。如果此修改意味着CustomerX可以看到其他客户CustomerY和CustomerZ报告的不应该看到的错误,那么CustomerX已设法创建二阶SQL注入攻击。 (如果注入只是意味着他们可以看到比他们应该更多的记录,包括那些与他们无关的记录,那么他们只是创建了一个错误的查询。)

显然,在VARCHAR(20)字段中,注入致命SQL的选项仅限于SQL,因为SQL是一种冗长的语言。但如果标准存储在较长的字段中,则'little Bobby Tables'可能会触发。

='';DELETE Bugs;--

(对DELETE语句使用非标准收缩;以18个字符发出吱吱声。)

你怎么能避免这种情况?不允许用户编写包含在生成的SQL中的原始SQL片段。将UserDefinedQuery.Bug_Status中的值视为空格/逗号分隔的字符串值列表,并相应地构建查询:

SELECT *
  FROM Bugs
 WHERE status IN ('=', '''open''', 'or', '1=1')
   AND ...other criteria...

查询可能没用,但它的结构不会被UserDefinedQuery表中的数据改变。