最新SQL注入漏洞原理及与MySQL相关的知识点

2023-11-16

点击星标,即时接收最新推文

5f1de9f4aa5dec4735a77a177f698e1c.png

本文选自《web安全攻防渗透测试实战指南(第2版)》

点击图片五折购书

39facc22d6809eceeb0479e083757431.gif

SQL注入漏洞简介

SQL注入是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数被带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。

一般情况下,开发人员可以使用动态SQL语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。

以PHP语句为例,命令如下:

$query = "SELECT * FROM users WHERE id = $_GET['id']";

由于这里的参数ID可控,且被带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。

当然,SQL注入按照不同的分类方法可以分为很多种,如报错注入、盲注、Union注入等。

1f39dff95d0f2f9eb0dac297d6b45987.gif

SQL注入漏洞原理

SQL注入漏洞的产生需要满足以下两个条件。

— 参数用户可控:前端传给后端的参数内容是用户可以控制的。

— 参数被带入数据库查询:传入的参数被拼接到SQL语句中,且被带入数据库查询。

当传入的参数ID为1'时,数据库执行的代码如下:

select * from users where id = 1'

这不符合数据库语法规范,所以会报错。当传入的参数ID为and 1=1时,执行的SQL语句如下:

select * from users where id = 1 and 1=1

因为1=1为真,且where语句中id=1也为真,所以页面会返回与id=1相同的结果。当传入的参数ID为and 1=2时,由于1=2不成立,所以返回假,页面就会返回与id=1不同的结果。

由此可以初步判断参数ID存在SQL注入漏洞,攻击者可以进一步拼接SQL语句进行攻击,致使其获取数据库信息,甚至进一步获取服务器权限等。

在实际环境中,凡是满足上述两个条件的参数皆可能存在SQL注入漏洞,因此开发者需秉持“外部参数皆不可信”的原则进行开发。

2bb674d84a34f05e1e9dd36b4b4fd62f.gif

MySQL中与SQL注入漏洞相关的知识点

在详细介绍SQL注入漏洞前,先介绍MySQL中与SQL注入漏洞相关的知识点。

在MySQL 5.0版本之后,MySQL默认在数据库中存放一个名为“information _schema”的数据库。在该库中,读者需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。

SCHEMATA表存储该用户创建的所有数据库的库名,如图4-7所示。需要记住该表中记录数据库库名的字段名为SCHEMA_NAME。

d3766b7a501ee7e365006cf7d215e31b.jpeg

图4-7

TABLES表存储该用户创建的所有数据库的库名和表名,如图4-8所示。需要记住该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。

882ade02b249bfeebda1786983e62d8d.jpeg

图4-8  

COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,如图4-9所示。需要记住该表中记录数据库库名、表名和字段名的字段名分别为TABLE_ SCHEMA、TABLE_NAME和COLUMN_NAME。

e31233db4c1d50177aa97ad14673cd66.jpeg

图4-9  

常用的MySQL查询语句和语法如下。

1.MySQL查询语句

在不知道任何条件时,语句如下:

SELECT 要查询的字段名 FROM 库名.表名

在有一条已知条件时,语句如下:

SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件的字段名='已知条件的值'

在有两条已知条件时,语句如下:

SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件1的字段名='已知条件1的值' AND 已知条件2的字段名='已知条件2的值'

2.limit的用法

limit的使用格式为limit m,n,其中m指记录开始的位置,m为0时表示从第一条记录开始读取;n指取n条记录。例如,limit 0,1表示从第一条记录开始,取一条记录。不使用limit和使用limit查询的结果分别如图4-10和图4-11所示,可以很明显地看出二者的区别。

7ceb23916e04788bcce7c7453af30cf7.jpeg

图4-10  

a8bdf3c3ef24f48320a3ef16f90a80a3.jpeg

图4-11  

3.需要记住的几个函数

— database():当前网站使用的数据库。

— version():当前MySQL的版本。

— user():当前MySQL的用户。

4.注释符

在MySQL中,常见注释符的表达方式为“#”“--空格”或“/**/”。

5.内联注释

内联注释的形式为/*! code */。内联注释可以用于整个SQL语句中,用来执行SQL语句,下面举一个例子。

index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3

8489acceff7002586cd2f84df4985833.gif

MS08067安全实验室视频号已上线

欢迎各位同学关注转发~

—  实验室旗下直播培训课程  —

168840c2eb375a14aaec68e72c0b9278.png

b258c4bc6fdfced236d0d1fbd9a5b63f.jpeg

233b1b74f8da81a110552f0657152daa.jpegbb4517d733ce8a3c3d97ca16820d797d.png

c8931cbe9e9bd475ba7236d93f943860.jpeg

119648d143fdde73f21690e14d871fa8.jpeg

035dfd14ac6983569a4c95af31ed994d.jpeg

28393ccd783a9c0fee1ab0a58a9515b5.jpeg

fd31843276ce6617a0279501ad2b44ae.jpeg


和20000+位同学加入MS08067一起学习

385f1ee4e87d6237c84973fd1562efb0.gif

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

最新SQL注入漏洞原理及与MySQL相关的知识点 的相关文章

  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • SPARK SQL - 当时的情况

    我是 SPARK SQL 的新手 SPARK SQL 中是否有相当于 CASE WHEN CONDITION THEN 0 ELSE 1 END 的内容 select case when 1 1 then 1 else 0 end from
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 当所有维度值都具有 100% 重要性时处理多对多维度

    我至少会尽力保持简洁 假设我们正在跟踪一段时间内的账户余额 所以我们的事实表将包含诸如 账户余额情况表 FK 账户ID FK 日期ID Balance 显然你有一个账户维度表 and a 日期维度表 所以现在我们可以轻松地过滤帐户或日期 或

随机推荐

  • web worker API开启浏览器js多进程

    面试使人进步 在大厂佬们的碾压下接触到了目前工作中没有遇到的新api和新思路以及解决方案 今天就来说说这个新的api web Worker 以下是MDN原话 指的是一种可由脚本创建的后台任务 任务执行中可以向其创建者收发信息 要创建一个 W
  • 关于微信小程序海报画布绘制

    小程序需要关于用户点击分享时弹起画布海报分享朋友或者朋友圈 1 我们需要先要创建一个画布 然后需要在js里去初始化画布并且制作出想要的画布海报样式 到目前为止咱们的画布海报图已经可以出现了 接下来咱们可以将已生成的海报图片 保存到手机或者分
  • vue 计算属性 vs 方法, 过滤器

    vue 计算属性 vs 方法 过滤器 最近换项目了 终于重新开始 使用 vue 了 继续学习中 computed 计算属性将被混入到 Vue 实例中 所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例 变量
  • vue项目部署到nginx服务器

    相信很多刚学习vue的朋友都可以进行到将vue项目进行npm run build这部 对于将build后的结果部署到nginx服务器上却一知半解 作者刚开始的时候也是很迷惑 看到网上很多朋友在问 今天作者就将自己的部署过程记录下来 供大家参
  • Keil MDK5生成bin文件时生成了*.bin文件夹

    在Keil魔术棒中通过以下方式生成bin文件时 看提示命令执行成功 却生成了一个 bin文件夹 文件夹内部是两个bin文件 当时感觉很奇怪 第一次遇到这种情况 使用的命令 fromelf exe bin o firmware L bin o
  • Object的方法(对象的遍历,合并等)。

    1 构造函数 Object 创建一个新的 Object 对象 该对象将会包裹 wrapper 传入的参数 2 静态方法 Object assign 通过复制一个或多个对象来创建一个新的对象 Object create 使用指定的原型对象和属
  • 5个高清视频素材网站,免费下载~

    免费高清视频素材网站 这几个你一定要知道 建议收藏 1 菜鸟图库 https www sucai999 com video html v NTYxMjky 菜鸟图库网素材非常丰富 网站主要还是以设计类素材为主 高清视频素材也很多 像风景 植
  • Prometheus和Grafana

    1 首先简单介绍Prometheus和Grafana Prometheus是由SoundCloud开发的开源监控报警系统和时间序列数据库 TSDB 它是一个监控采集与数据存储框架 监控服务器端 具体采集什么数据依赖于Exporter 监控客
  • TrueCrypt简介、在VS2008下的编译过程

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 编译过程中用到的工具下载地址 http download csdn net detail chenyujing1234 4448383 资
  • JSP学习之初识JSP(实现简单的计算器)

    IE浏览器 gt Tomcat gt 数据库 访问JSP的过程 如果是第一次访问 jsp文件被服务器翻译成一个对应的java文件 Servlet 然后 再被编译成一个 class文件并装载到服务器的内存中 如果以后访问JSP 那就直接调用内
  • vue + ant design vue 项目打包优化

    废话不多说 直接上代码 main js 注释掉 vue 和 antdv Vue use antd 这句话一定不能删除 antd 变量虽然没有定义 但是 是cdn资源里面的模块 一定要引入进来 如果提示 antd 未定义可能是 cdn 资源问
  • CSS基础学习--27 常使用的属性

    一 文本效果 属性 描述 CSS hanging punctuation 规定标点字符是否位于线框之外 3 punctuation trim 规定是否对标点字符进行修剪 3 text align last 设置如何对齐最后一行或紧挨着强制换
  • 应用层与驱动层通信DeviceIoControl

    驱动层与应用层通信是通过DeviceIoControl 符号定义 define DEVICE NAME L Device myDriver Driver Name define SYMBOLIC LINK NAME L DosDevices
  • vue实现给当前元素添加样式,其他元素无样式

    vue实现给当前元素添加样式 其他元素无样式 今天做项目的时候遇到 给当前元素绑定样式 原来使用原生js写点亮盒子的时候都是利用for循环 循环元素列表 在利用this来绑定当前元素 给当前元素添加类名或类样式 当然在添加类样式前 还要将所
  • 把iconfront的资源放cdn访问_详解mpvue小程序中怎么引入iconfont字体图标

    前言 iconfont阿里巴巴矢量图标库是我很喜欢的一个网站 可以下载 在线编辑 上传自己需要的矢量图标 也支持团队协作 那么在mpvue项目中如何引入呢 将图标加入购物车 搜索关键词可以是中文也可以是英文 下载素材 点击网站右上角的购物车
  • C/C++中#pragma once的使用

    在C C 中 为了避免同一个文件被include多次 有两种方式 一种是 ifndef方式 一种是 pragma once方式 在头文件的最开始加入 ifndef SOME UNIQUE NAME HERE define SOME UNIQ
  • 一本二本三本有什么区别

    一本二本三本有什么区别 很多家长和考生问老师 一本二本三本到到底什么区别于老师给大家普及一下 其实一本 二本 三本 无论是学历性质还是学历层次都是一样的 毕业证书除了毕业学校的公章和校长的签章 其他没有任何区别 都是中华人民共和国教育部监制
  • tensorflow中,session.run()与tensor.eval()的区别

    session run 与tensor eval 都是tensorflow用来计算图的一一部分的方法 那么这两种方式有什么异同呢 假设有一个tensor a 在使用a eval时 等价于 sess run 其中 sess是当前默认会话 这这
  • GitHub 开源推荐

    说起 Web 开发 大多数人会想到 Java Python Golang 因为它们的主流 Web 框架有很多 Java 有非常知名的 Spring 全家桶 Python 有大而全的 Django 小而精的 Flask 高性能的 Tornad
  • 最新SQL注入漏洞原理及与MySQL相关的知识点

    点击星标 即时接收最新推文 本文选自 web安全攻防渗透测试实战指南 第2版 点击图片五折购书 SQL注入漏洞简介 SQL注入是指Web应用程序对用户输入数据的合法性没有判断 前端传入后端的参数是攻击者可控的 并且参数被带入数据库查询 攻击