一、概述
识别数据库的最好方法在很大程度上取决于是否处于盲态。
如果应用程序返回(至少在某种程度上)查询结果和(或)数据库服务器错误消息(例如,非盲态),那么跟踪会相当简单,因为可以很容易通过产生的输出结果来提供关于底层技术的信息。
但如果处于盲态,无法让应用返回数据库服务器消息,那么就需要改变方法,尝试注入多种已知的、只针对特定技术才能执行的查询。
通过判断这些查询中的哪一条被成功执行,获取目前面对的数据库服务器的精确信息。
二、非盲跟踪
大多数情况下,要了解后台数据库服务器,只需查看一条足够详细的错误消息即可。
根据执行查询所使用的数据库服务器技术的不同,这条由同类型SOL错误产生的消息也会各不相同。
例如,添加一个单引号将迫使数据库服务器将单引号后面的字符看作字符串而非SOL代码,这会产生一条语法错误。
2.1 常见数据库报错
Microsoft SQL Server
Microsot OLE DB Provider for ODBC Drivers error '80040e14' [Microsof][ODBC SOL Server Driver][SQL ServerjUnclosed quotation mark after the character string " /products.asp, line 33
MySQL
ERROR 1064(42000):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
这里的错误消息也包含了清晰的、关于数据库服务器技术的线索。
其他错误可能用处不大,但通常这不是问题。
请注意后面这条错误消息开头部分的两个错误代码。这些代码本身就是MySQL的 “签名” 。
Oracle
ORA-01773:may not specify column datatypes in this CREATE TABLE
PostareSQL
然而有时,具有启示意义的关键信息并非来自于数据库服务器本身,而是来自于访问数据库的技术。例如,请看下面的错误:
pg query(): Query failed: ERROR: unterminated quoted string at or near ""at character 69 in /var/www/php/somepge.php on line 20
这里并没有提及数据库服务器技术,但是有一个特定数据库产品所独有的错误代码。
PHP使用 pg_query 函数(以及已经弃用的版本pgexec函数)对 PostgreSQL 数据库执行查询,因此可以立即推断出后台运行的数据库服务器是 PostgreSQL。
2.2 获取标志信息
幸运的是,如果 Web 应用返回了所注入查询的结果,那么要弄清其准确技术通常会很容易。
所有主流数据库技术都至少允许通过一条特定的查询来返回软件的版本信息。
我们需要做的是让 Web 应用返回该查询的结果。
此表给出了各种特定技术所对应的查询示例,它们将返回包含准确数据库服务器版本信息的字符串
数据库 | 查询 |
Micrsoft SQL Server | SELECT @@version |
MySQL | SELECT verson() |
SELECT @@version |
Oracle | SELECT banner FROM v$version |
SELECT banner FROM v$version WHERE rownum = 1 |
Postgre SQL | SELECT version() |
现在咱们主要注意两个数据库,因为它们会返回底层操作系统和系统架构信息的数据库
Micrsoft SQL Server
Microsoft SQL Server 2019 (RTM-CU12) (KB5003830) - 15.0.4188.2 (X64) Jun 15 2022 02:36:30 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19041: ) (Hypervisor)
Microsoft SQL Server 2019: 这是 SQL Server 的主要版本号,这里表示是 2019 版本。
(RTM-CU12) (KB5003830): 这部分提供了关于该 SQL Server 版本更新和补丁的额外信息。RTM 可能代表“Release to Manufacturing”,CU 代表累积更新(Cumulative Update),KB 号码是用于标识特定更新或补丁的编号。
15.0.4188.2: 这是 SQL Server 的内部版本号,通常由主版本号、次版本号、构建号和修订号组成。
(X64): 表示这个 SQL Server 实例是为 64 位系统编译的。
Jun 15 2022 02:36:30: 这是 SQL Server 实例的编译日期和时间。
Copyright (C) 2019 Microsoft Corporation: 版权信息,表明这个 SQL Server 是由 Microsoft Corporation 在 2019 年发布的。
Developer Edition (64-bit): 表示这个 SQL Server 实例是开发者版,并且是 64 位的。SQL Server 有多个版本,包括企业版、标准版、开发者版等,每个版本都有其特定的用途和许可要求。
on Windows 10 Pro 10.0 (Build 19041: ) (Hypervisor): 这部分描述了 SQL Server 实例运行的操作系统环境。这里表明 SQL Server 是在 Windows 10 Pro 10.0 的 64 位版本上运行的,并且该 Windows 版本构建号是 19041。(Hypervisor) 表示该操作系统可能正在虚拟机或具有超虚拟化功能的物理机上运行。
Postgre SQL
PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
PostgreSQL 13.3: 这是 PostgreSQL 的主要版本号,这里表示是 13.3 版本。
(Debian 13.3-1.pgdg100+1): 这部分提供了关于 PostgreSQL 版本在特定发行版(这里是 Debian)中的额外信息,包括该发行版特有的版本号或补丁信息。
on x86_64-pc-linux-gnu: 这部分描述了 PostgreSQL 运行的硬件架构和操作系统类型。在这里,它运行在 x86_64 架构的 Linux 系统上。
compiled by gcc (Debian 8.3.0-6) 8.3.0: 这部分告诉我们 PostgreSQL 是用哪个编译器以及哪个版本编译的。在这里,它使用 Debian 8.3.0-6 版本的 gcc 编译器进行编译的。
64-bit: 这表示 PostgreSQL 是 64 位版本的。
三、盲跟踪
3.1 根据字符串推断
如果应用不直接在响应中返回您所需要的信息,那么要想了解后台使用的技术,就需要采用一种间接方法。
这种间接方法基于不同数据库服务器所使用的SQL方言上的细微差异。
最常用的技术是利用不同产品在连接字符串方式上的差异。我们以下面的简单查询为例:
最常用的技术是利用不同产品在连接字符串方式上的差异。我们以下面的简单查询为例:
SELECT "somestring"
该查询对大多数主流数据库服务器都是有效的,但如果想将其中的字符串分成两个子串,不同产品间便会出现差异。具体来讲,可以利用此表列出的差异来进行推断。
数据库 | 查询 |
Micrsoft SQL Server | SELECT 'some' + 'string' |
MySQL | SELECT 'some' 'string' |
SELECT CONCAT('some', 'string') |
Oracle | SELECT 'some' || 'string' |
SELECT CONCAT('some', 'string') |
PostgreSQL | SELECT 'some' || 'string' |
SELECT CONCAT('some', 'string') |
因此,如果拥有一个可注入的字符串参数,便可以尝试不同的连接语法。
通过判断哪一个请求会返回与原始请求相同的结果,您可以推断出远程数据库的技术。
3.2 根据数字函数推断
假使没有可用的易受字符串参数,则可以使用与数字参数类似的技术。
具体来讲,您需要一条针对特定技术的SQL语句,经过计算后它能成为一个数字。
此表中的所有表达式在正确的数据库下经过计算后都会成为整数,而在其他数据库下将产生一个错误。
数据库 | 查询 |
Micrsoft SQL Server | @@pack_received |
@@rowcount |
MySQL | connection_id() |
last_insert_id() | |
row_count() |
Oracle | BITANID(1,1) |
Postgre SQL | SELECT EXTRACT(DOW FROW NOW()) |