SQL注入漏洞

2024-01-07 22:50:05

一.SQL注入漏洞描述

? SQL注入漏洞是一种常见的web应用程序安全漏洞,攻击者可利用这种漏洞来篡改或绕过应用程序的身份验证和授权机制,从而访问或控制数据库中的数据。 在SQL注入攻击中,攻击者向应程序发送恶意输入数据,这些输入数据被解释为SQL查询或命令,并可以执行数据库中的任意操作。要防止SQL注入漏洞,可以使用预编译语句和参数化查询等安全编码技术,以及正确的输入验证和过滤措施。此外,您可以为应用程序实施安全的开发最佳实践,例如最小权限原则和及时打补丁等。

二.SQL注入的危害

1.数据库破坏:攻击者可以通过注入恶意代码修改、删除或破坏数据库中的数据。这可能导致数据的永久丢失、数据库的不一致性或不可用性。

2.数据泄露:攻击者可以利用注入漏洞查询数据库中的敏感信息,如用户的个人身份信息、密码、信用卡号码等,进而导致个人隐私泄露、身份盗用、财务损失等。

3.身份认证绕过:通过SQL注入攻击,攻击者可能能够绕过身份验证或访问控制机制,以管理员身份执行未经授权的操作。

4.操作系统攻击:SQL注入还可以用于执行操作系统命令,攻击者可以通过注入系统命令执行恶意操作,例如删除文件、创建后门、操纵服务器等。

5.DoS攻击:攻击者可以利用SQL注入漏洞发动拒绝服务(DoS)攻击,通过注入大量恶意代码或查询,占用数据库资源导致系统崩溃或变得不可用

三.MYSQL数据库

1)information_schema库

information_schema库包含了四个主要的表:

1.TABLES:存储数据库中所有表的元信息。

2.COLUMNS:存储数据库中所有表的列信息。

3.SCHEMATA:存储所有数据库的信息。

4.STATISTICS:存储有关表索引、主键和外键等的统计信息。

2)MySQL数据库的增删改查

#增

insert into 表名 values("数据1","数据2",...);

insert into 表名 (字段名称1,字段名称2,...) values ("数据1","数据2",...);

#删

delete from 表名;

delete from 表名 where id=1;

#改

update 表名 set 字段名称="新的值",字段名称="新的值";

update 表名 set 字段名称="新的值",字段名称="新的值" where id=1;

#查

select * from 表名;

select 字段名称1,字段名称2 from 表名 where id=1;

3)MYSQL常用的函数

#系统函数

select version()???? #显示数据库版本

select user()????????? #数据库用户名

select database()?? #数据库名

select @@datadir? #数据库路径

select @@version——compile_os? #操作系统版本

4)用于尝试的语句

or 1=1--+

'or 1=1--+

''or 1=1--+

)or 1=1--+

')or 1=1--+

'')or 1=1 --+

''))or 1=1 --+

四.SQL注入漏洞的分类

1.基于错误的SQL注入:攻击者通过向应用程序中注入SQL语句来生成错误消息,从而获得有关应用程序的敏感信息。

2.基于盲注的SQL注入:攻击者通过不断地发送SQL语句并根据应用程序的响应来推断SQL查询的结果。

3.基于联合查询注入的SQL注入:攻击者可以利用应用程序中的联合查询功能,通过修改查询来访问或修改数据库中的数据。

4.基于时间的SQL注入:攻击者可以利用应用程序中的时间函数,通过延长SQL查询的响应时间来推断SQL查询的结果。

5.登录绕过攻击:攻击者通过通过输入恶意的用户名和密码,利用SQL注入漏洞来绕过应用程序的身份验证机制。

6.目录遍历攻击:攻击者可以利用应用程序中的文件上传和下载功能,通过注入SQL查询来绕过应用程序安全机制,访问非授权的文件或目录。

1)联合注入

联合注入是一种常见的针对数据库的注入攻击技术之一。它利用了应用程序对于用户输入的不正确处理,通过在SQL查询中使用联合操作符来获取额外的数据。

SELECT column1, column2 FROM table1 WHERE id = '1' UNION SELECT table_name, column_name FROM information_schema.columns --???
#第一个查询是正常的,选择了 column1 和 column2 的数据,条件为 id 等于 ‘1’。第二个查询是联合查询,选择了 information_schema.columns 表中的 table_name 和 column_name。注入位置的后面加上 ’ UNION SELECT table_name, column_name FROM information_schema.columns --'。“–” 是注释符,这样注入后的查询将忽略原始查询的余下部分。
2)布尔注入

布尔注入 是一种基于布尔值相应的技术,利用了应用程序在响应 SQL 查询结果时对于不同响应的处理方式。攻击者可以通过布尔注入技术来确定或推断 SQL 查询中的条件语句是否为真,从而收集敏感数据。

SELECT * FROM users WHERE username = 'admin' AND 1=1 --

# ?将条件修改为了?1=1,这是一个始终为真的条件。通过这种方式,攻击者可以绕过原始查询的条件约束,并获取指定用户名为 ‘admin’ 的用户的数据。

3)时间注入

时间注入是一种基于时间延迟的注入攻击技术。在许多情况下,攻击者可以通过应用程序中延迟或暂停操作的方式,来推断出操作成功或失败的结果,并通过不同的时间响应来做出判断。攻击者可以利用这种技巧,来推断出数据库中的敏感信息。

' OR IF(SLEEP(5), 1, 0) --????
# payload 是在用户输入的参数中注入的,通过在查询语句的末尾添加?' OR IF(SLEEP(5), 1, 0) --。这个 payload 使用?SLEEP?函数来引入 5 秒钟的延迟。
4)报错注入

报错注入是一种利用应用程序返回的错误信息来推断数据库状态和信息的注入攻击技术。攻击者通过向应用程序传递恶意查询语句来触发程序错误,从而获得敏感信息。

假设我们有一个应用程序,执行以下 SQL 查询来获取用户的个人信息:

SELECT * FROM users WHERE username = '[username]' AND password = '[password]'

攻击者可以尝试在?username?或?password?参数中注入恶意代码来触发报错信息,进而获取敏感信息。
示例 payload 如下:

' OR (SELECT 1 FROM (SELECT COUNT(*), CONCAT(version(), FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) --

在这个示例中,payload 是通过在输入参数中注入的,并且利用注入的查询条件来触发报错信息,以获取数据库的版本号。

5)二次注入

二次注入(Second-Order Injection)是一种注入攻击,攻击者通过在应用程序中使用受到攻击的数据 (如用户输入或错误日志)来生成并提交恶意数据,而不是使用直接的通道。

文章来源:https://blog.csdn.net/lin__ying/article/details/135436440
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。