利用 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
相关文章
|
3天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
2天前
|
存储 SQL 关系型数据库
SQL 用于各种数据库的数据类型
SQL 用于各种数据库的数据类型
10 2
|
1天前
|
SQL 数据库
零基础学习数据库SQL语句之操作表中数据的DML语句
零基础学习数据库SQL语句之操作表中数据的DML语句
4 0
零基础学习数据库SQL语句之操作表中数据的DML语句
|
1天前
|
SQL 前端开发 关系型数据库
零基础学习数据库SQL语句之查询表中数据的DQL语句
零基础学习数据库SQL语句之查询表中数据的DQL语句
4 0
|
1天前
|
SQL 关系型数据库 MySQL
零基础学习数据库SQL语句之定义数据库对象的DDL语句
零基础学习数据库SQL语句之定义数据库对象的DDL语句
9 0
|
1天前
|
SQL 关系型数据库 MySQL
MySQL数据库数据模型概念入门及基础的SQL语句2024
MySQL数据库数据模型概念入门及基础的SQL语句2024
7 0
|
2天前
|
SQL Java 数据库连接
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
7 0
|
4天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
12天前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
241 1
|
1月前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
161 1

热门文章

最新文章