如何知道 Web 应用程序背后是哪个数据库?

信息安全 Web应用程序 数据库
2021-09-03 04:13:41

我读过不同的数据库(mysql,sql server,...)有不同的漏洞,并且它们容易受到某些特定 sql 注入的影响。

当攻击者试图对网站进行数据库攻击(如SQL注入)时,首先识别数据库的种类,然后对检测到的数据库进行攻击思考。

攻击者如何执行先前的检查?使用一些特殊的查询?有具体的工具吗?我没有找到这方面的任何信息。

4个回答

假设您有这样的查询:

$q="SELECT username, joindate FROM users WHERE username LIKE '%" . $search . "%' LIMIT 20";

现在想象你$search通过一个参数来控制。我们通常会让它在joindate字段中返回用户密码,如下所示:

$search="' UNION SELECT username, password FROM users; -- -";

因此,查询变为:

SELECT username, joindate FROM users WHERE username LIKE '%' UNION SELECT username, password FROM users; -- - %' LIMIT 20

双连字符后面的部分是注释,因此它被忽略,我们将所有用户名和密码组合作为新记录附加到数据集的末尾,在合法记录之后。惊人的!

但是现在我们要修改这个,以便我们可以找到数据库名称,以便进一步调查他们的数据库。在 MySQL 上,我们可以使用以下DATABASE()函数:

$search="' UNION SELECT DATABASE(), 1; -- -";

这里的用途1是填充joindate我们没有使用的字段。

在 MSSQL 上,我们可以做同样的事情,但是DB_NAME()

$search="' UNION SELECT DB_NAME(), 1; -- -";

这两个技巧都会在结果集的末尾追加一行,包含数据库名称。

然后我们可以扩展这个技巧以VERSION()在 MySQL 或@@VERSIONMSSQL 上使用,它返回当前数据库版本。对于 Oracle 和 PL/SQL,您可以检查v$version是否存在,只需对其进行查询并检查错误即可。

除了其他答案之外,我用于数据库指纹识别的一种方法(特别是在注入是盲目的并且不返回数据的情况下)是数据库引擎之间的语法差异。本演示文稿的幻灯片 34 上有一个很好的示例,我倾向于使用它。

所以一个很好的例子是字符串连接。MS-SQL 和 DB2 使用 + 而 Oracle PL/SQL 和 PostGRES 使用 ||,因此您可以将其插入字符串并观察应用程序的行为。如果它的行为就像字符串被连接,那么它可能是注入。

攻击者确定应用程序正在使用哪个数据库的最简单方法之一是使应用程序在数据库查询中以某种方式出错。

然后,如果应用程序中未启用错误处理(通常不是),将显示数据库错误。这些通常非常详细,您可以从中确定数据库。

如果您知道以下任何一种 Web 应用程序所用的语言、正在使用的框架、正在使用的平台、托管服务提供商等,它们都可以帮助您确定正在使用的数据库。例如,如果他们使用 asp 很可能使用 MSSQL,如果他们使用 PHP 很可能使用 MySQL。显然,这并非一直都是正确的,但是如果您不得不猜测说盲目的 sql 注入攻击,它是另一种缩小范围的方法。

有很多方法可以做到这一点。但是,请注意,您不需要知道执行攻击的数据库类型。知道它可能会提供额外的或替代的攻击向量,但对于 SQL 注入来说不是必需的。

大多数数据库都提供功能或字典故事,可用于识别数据库类型和版本。这些在供应商之间有所不同,但如果您找到了一个通用的 sql 注入点,您可以尝试每一个,直到获得有效的响应。

SQL 的许多不同方言之间也存在语法差异。例如,Oracle 使用 (+) 语法来表示外连接。可用数据类型通常存在细微差别,例如 postgres 的文本类型(Oracle 没有)或序列/自动递增列的处理方式等。

有时,您可以通过获取数据库驱动程序或连接器详细信息来判断。根据环境、语言等,这可能是微不足道的,也可能不是微不足道的。