了解基于布尔的 SQL 注入

信息安全 sql注入 注射
2021-08-29 11:56:47

我试图理解基于布尔的盲 SQL 注入的概念。我已经通过OWASP Guide To SQLi来理解它。但是,我对它的工作原理感到困惑。以下是我从上面链接中的文章中了解到的。请让我知道我的理解是否正确或我是否误解了某些内容。

因此,根据上面的链接,我们假设一个示例 URL,其中易受攻击的参数是“id”:

http://www.example.com/index.php?id=1'

因此,在服务器上执行的相应查询可能是:

SELECT field1, field2, field3 FROM Users WHERE Id='$Id' 

现在假设Users包含一个名为 的字段Username,我们想使用我们的布尔技术提取该Username字段的值。id=1所以我们尝试通过这样做来逐个字符地猜测这个值:

$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1 

这篇文章说,每当我们发现评估为假时,我们都会将 ASCII 值从 97 开始增加 1 到 1。

现在这里的问题是如何查找从上述查询返回的结果是TRUE还是FALSE

所以为了解决这个问题,文章说我们在尝试上述方法之前先尝试执行以下操作:

$Id=1' AND '1' = '2所以这会生成查询SELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'

执行上述查询后,服务器将返回某些状态(页面、重定向等)。现在,由于1=2将始终评估为FALSE,我们将了解在FALSE查询返回结果的情况下会发生什么。

现在我们可以将这个结果与我们通过执行得到的结果相匹配$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1,从而得出结论,如果针对 97(或任何特定的 ASCII 值)的测试评估为TRUE FALSE.

  1. 我对上述的理解正确吗?
  2. 如果是,那么在查询中$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1,为什么我们需要 ? 之后的部分AND我的意思是,如果没有查询的粗体字,我们就不能确认结果(如上面分析中所确认的)吗?为什么确实需要查询的粗体部分?
  3. 由于在这种技术中,我们基本上也是在尝试查看错误页面并将其与成功页面区分开来,因此不应该将其视为基于错误的 SQLi 而不是将其称为基于布尔值吗?
1个回答

我对上述的理解正确吗?

是的,你的理解是正确的。

如果是,那么在查询中, $Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1,上面的粗体部分需要什么?我的意思是,如果没有查询的粗体字,我们不能确认结果(如上面分析中所确认的)吗?为什么确实需要查询的粗体部分?

为了成功利用 SQL 注入,生成的 SQL 必须是有效的。尾随AND '1'='1是将注入的代码适合现有的语句。由于我们从1'开头的字符串文字中逃脱,我们需要在结尾引入一个新的字符串文字。但是,也可以使用AND ASCII(SUBSTRING(username,1,1))='97MySQL 将字符串与整数值进行比较。

由于在这种技术中,我们基本上也是在尝试查看错误页面并将其与成功页面区分开来,因此不应该将其视为基于错误的 SQLi 而不是将其称为基于布尔的 SQLi 吗?

当服务器响应实际的技术错误消息时,会出现基于错误的 SQL 注入,例如:

#1064 - 您的 SQL 语法有错误。检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''' 附近使用正确的语法

在这里,您可以看到生成的 SQL 的哪一部分确实失败了,并且您可能会推断如何通过注入来修复它。

在基于布尔的 SQL 注入中,您所看到的只是不同输入的不同行为。这种不同的行为可能包括对错误消息的响应,但除非它具有技术细节来告诉您出了什么问题,否则它不会比任何其他布尔行为更能帮助您。