利用 SQL 注入识别数据库方法总结

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 利用 SQL 注入识别数据库方法总结

一、概述


识别数据库的最好方法在很大程度上取决于是否处于盲态。


如果应用程序返回(至少在某种程度上)查询结果和(或)数据库服务器错误消息(例如,非盲态),那么跟踪会相当简单,因为可以很容易通过产生的输出结果来提供关于底层技术的信息。


但如果处于盲态,无法让应用返回数据库服务器消息,那么就需要改变方法,尝试注入多种已知的、只针对特定技术才能执行的查询。


通过判断这些查询中的哪一条被成功执行,获取目前面对的数据库服务器的精确信息。

二、非盲跟踪


大多数情况下,要了解后台数据库服务器,只需查看一条足够详细的错误消息即可。

根据执行查询所使用的数据库服务器技术的不同,这条由同类型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())













相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17小时前
|
SQL 安全
jeecg-boot sql注入漏洞解决
jeecg-boot sql注入漏洞解决
20 0
|
17小时前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
10 1
|
17小时前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
12 2
|
17小时前
|
SQL 关系型数据库 MySQL
0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)
0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)
|
17小时前
|
SQL NoSQL 关系型数据库
一个基于 BigQuery 的 SQL 注入挖掘案例
一个基于 BigQuery 的 SQL 注入挖掘案例
6 0
|
17小时前
|
SQL 数据库
数据库SQL语言实战(六)
本次实战的重点就在于对表格本身的一些处理,包括复制表格、修改表格结构、修改表格数据
|
17小时前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
17小时前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
17小时前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(三)
本篇文章重点在于SQL中的各种删除操作
|
17小时前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
10 0