利用 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 ServerSELECT @@version
MySQLSELECT verson()
SELECT @@version
OracleSELECT banner FROM v$version
SELECT banner FROM v$version WHERE rownum = 1
Postgre SQLSELECT 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 <X64> (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 ServerSELECT 'some' + 'string'
MySQLSELECT 'some' 'string'
SELECT CONCAT('some', 'string')
OracleSELECT 'some' || 'string'
SELECT CONCAT('some', 'string')
PostgreSQLSELECT 'some' || 'string'
SELECT CONCAT('some', 'string')

因此,如果拥有一个可注入的字符串参数,便可以尝试不同的连接语法。

通过判断哪一个请求会返回与原始请求相同的结果,您可以推断出远程数据库的技术。 

3.2 根据数字函数推断

假使没有可用的易受攻击字符串参数,则可以使用与数字参数类似的技术。

具体来讲,您需要一条针对特定技术的SQL语句,经过计算后它能成为一个数字。

此表中的所有表达式在正确的数据库下经过计算后都会成为整数,而在其他数据库下将产生一个错误。 

数据库查询
Micrsoft SQL Server@@pack_received
@@rowcount
MySQLconnection_id()
last_insert_id()
row_count()
OracleBITANID(1,1)
Postgre SQLSELECT EXTRACT(DOW FROW NOW())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信分类3G,4G,5G,通信专用名词

Generation: 2G: GSM全名为&#xff1a;Global System for Mobile Communications&#xff0c;中文为全球移动通信系统&#xff0c;俗称"全球通"&#xff0c;是一种起源于欧洲的移动通信技术标准&#xff0c;是第二代移动通信技术 3G&#xff1a;WCDMA 4G&#xff1a…

VMware vSphere Hypervisor,ESXi的介绍,下载与安装

1.介绍 看这篇文章就好了 Vmware ESXi 是免费吗&#xff1f;一文弄懂vSphere功能特性及ESXi与vSphere到底有什么区别和联系。 - 知乎 (zhihu.com) 2.下载 这里面有7.0各个版本的下载镜像文件和校验信息 VMware-Esxi7.0各个版本镜像文件iso下载链接_esxi7.0镜像-CSDN博客 3.…

计算机网络-TCP基础、三次挥手、四次握手过程

TCP基础 定义&#xff1a;TCP是面向连接的、可靠的、基于字节流的传输层通信协议。这意味着在发送数据之前&#xff0c;TCP需要建立连接&#xff0c;并且它能确保数据的可靠传输。此外&#xff0c;TCP将数据视为无结构的连续字节流。面向连接&#xff1a;TCP只能一对一进行连接…

RAG文本加载和分块调研

文本加载和分块 一、文本加载 文本加载是RAG文本增强检索重要环节。文件有不同类型&#xff08;excel、word、ppt、pdf、png、html、eps、gif、mp4、zip等&#xff09;&#xff0c;衍生出了很多第三方库。使用python处理文件是各种python开发岗位都需要的操作。主要涉及到的标准…

从0开始复习python~

//&#xff0c;int() , abs(), divmod() ,float() ,complex() ,pow(), ** , bool() ,or , and , len() , range() , str() , 其中 for i in xxx: else: xxxxx; 有点意思... # 地板除&#xff0c;向下取整 print(-3//2) # 只保留整数部分 print(int(3.72)) # 绝对值 print…

【智能算法】随机油漆优化算法(SPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;A Kaveh等人受到绘画艺术启发&#xff0c;提出了减法平均优化器&#xff08;Stochastic Paint Optimizer&#xff0c;SPO&#xff09;。 2.算法原理 2.1算法思想 SPO将搜索空间…

2024 Linux(centOS7) 下安装 Docker -- Docker中运行ollama模型

首先进入docker中运行以下命令&#xff1a; 安装yum-utils yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken 更换下载源为&#xff1a;阿里云 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.r…

von Mises-Fisher Distribution (Appendix)

2. Relation to Normal Distribution 疑问&#xff1a;有没有不各向同性的 vMF&#xff1f; 答&#xff1a;应该是没有的&#xff0c;如果想让各方向偏离中心的速度不一致&#xff0c;则协方差矩阵不为 I \bm{I} I 的倍数. 正态分布的概率密度函数为&#xff1a; f ( x ) 1 …

C语言形参和实参有什么区别?

一、问题 形式参数和实际参数都叫参数&#xff0c;那么⼆者之间的区别是什么&#xff1f; 二、解答 1. 问题分析 对于这类问题&#xff0c;最终体现在程序中会更加明确。 2. 解析问题 &#xff08;1&#xff09;通过名称理解 形式参数&#xff1a;按照名称理解&#xff0c;…

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…

RuntimeError: Error(s) in loading state_dict for ZoeDepth解决方案

本文收录于《AI绘画从入门到精通》专栏,订阅后可阅读专栏内所有文章,专栏总目录:点这里。 大家好,我是水滴~~ 本文主要介绍在 Stable Diffusion WebUI 中使用 ControlNet 的 depth_zoe 预处理器时,出现的 RuntimeError: Error(s) in loading state_dict for ZoeDepth 异常…

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法

故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法 目录 故障诊断 | Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断算法分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现基于小波…

代码随想录学习Day 26

332.重新安排行程 题目链接 from collections import defaultdictclass Solution:def findItinerary(self, tickets):targets defaultdict(list) # 创建默认字典&#xff0c;用于存储机场映射关系for ticket in tickets:targets[ticket[0]].append(ticket[1]) # 将机票输入…

win11网络驱动怎么安装,windows11怎么安装驱动

win11网络驱动怎么安装呢?驱动程序是系统中非常重要的部分,当安装新硬件时,相应的硬件没有驱动程序,那么在计算中就无法工作。而有了驱动后,计算机就可以与设备进行通信。例如,电脑如果缺少了网络驱动,那么就会无法上网,需要安装上网的驱动程序。由于win11系统变化太大…

Echarts柱状图多样式实现

样式一 样式二 在这里插入代码片

数据库索引详解

目录 第一章、快速了解索引1.1&#xff09;索引是什么1.2&#xff09;为什么使用索引1.3&#xff09;操作索引示例 第二章、索引分类2.1&#xff09;按数据结构分类2.1.1&#xff09;树型数据结构索引二叉树B树B 树 2.1.2&#xff09;Hash数据结构索引2.1.3&#xff09; 其他数…

【JavaWeb】Day34.MySQL概述——数据库设计-DDL(一)

项目开发流程 需求文档&#xff1a; 在我们开发一个项目或者项目当中的某个模块之前&#xff0c;会先会拿到产品经理给我们提供的页面原型及需求文档。 设计&#xff1a; 拿到产品原型和需求文档之后&#xff0c;我们首先要做的不是编码&#xff0c;而是要先进行项目的设计&am…

AOP 面向切面编程 入门练习

编写过程 添加依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><…

Python算法岗面试典型题目及答案

面试Python算法岗位时&#xff0c;候选人通常会遇到一系列设计来考察其编程能力、算法理解和解决问题能力的题目。这些题目范围可以从基本的数据结构操作到更复杂的算法问题。下面是一些典型的上机测试题及其解答示例&#xff1a; 1. 两数之和 题目描述&#xff1a; 给定一个…

使用c++自建循环链表和自建队列分别解决约瑟夫问题

//自建循环链表解决约瑟夫问题 void CircleLinkList::yuesefu(int go_num) { CircleLinkNode* curr = head; CircleLinkNode* prev = nullptr; while (size > 0) { for (int i= 1; i <= go_num; i++) { prev = curr; …