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