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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 利用 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())













相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
1月前
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
9天前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
110 28
|
1天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
23天前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
40 16
|
25天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
2月前
|
数据库
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。

热门文章

最新文章