网络安全之SQL注入

一、什么是SQL注入

SQL注入(SQL Injection)是一种代码注入技术,它允许攻击者将或“注入”恶意的SQL命令插入到后端数据库查询字符串中,从而绕过安全措施,执行未授权的数据库操作。这些操作可能包括数据检索、数据修改、数据删除,甚至在服务器上执行管理命令,从而完全控制受影响的系统。

ok,定义说完了,来举个栗子

select * from users where id='1'

假设这样一个情景,在一个网页的某个输入框中,要求用户输入id号,然后网页会显示该用户的信息,那么如果输入1,在数据库后台实际上执行的就是上述的sql语句。

那么如果我输入这样一段语句

1' order by 4--+ 

那么在后台数据库中实际上执行的是这样的语句

select * from users where id='1' order by 4--+'

我们暂且不管它具体的作用,总之,通过输入一段特殊的sql语句,我们可是让数据库执行我们所期望的sql语句,来返回我们需要的数据,接下来,我们就简单介绍sql注入的类型。

二、SQL注入的类型

1.布尔注入

基于布尔逻辑的盲注,攻击者根据页面返回的结果(通常是真或假)来判断注入的SQL代码是否执行成功。

2.联合注入

攻击者通过在SQL语句中添加UNION操作符,将恶意查询与合法查询合并在一起执行,从而获取额外的信息。

3.多语句注入

允许攻击者执行多个SQL语句,这些语句被数据库服务器连续执行。在某些情况下,攻击者还可以利用数据库的延时特性(如SLEEP()函数)来实施时间盲注攻击。

4.报错注入

当数据库执行了错误的SQL语句时,会在页面上返回错误信息。攻击者可以利用这些错误信息来推断数据库的结构或数据。

5.延时注入

攻击者通过使数据库执行具有时间延迟的SQL语句(如SLEEP()函数),根据页面响应的时间来判断注入的SQL代码是否执行成功。

6.内联注入

攻击者直接在SQL语句的某个部分插入恶意的SQL代码片段,以改变SQL语句的执行逻辑。

三、注入步骤

1.试探sql注入点

输入?id=1'这种简单的sql语句来试探网页是否会显示报错信息,或者运行出错等,若出现,则可作为sql注入点。同时根据报错信息也可以确认数据库对于参数的闭合方法,一般都是单引号或者多引号,比如

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
从这段报错中看出参数已成功以单引号闭合但因为1后面还有个单引号导致错误,后面的limit的语法格式是
LIMIT [位置偏移量,] ⾏数
其中,中括号⾥⾯的参数是可选参数,位置偏移量是指 MySQL 查询分析器要从哪⼀⾏开始显
示,索引值从 0 开始,即第⼀条记录位置偏移量是 0,第⼆条记录的位置偏移量是 1,依此类推...,第⼆个参数为“⾏数”即指示返回的记录条数。这条语句就是id为1的那行记录后移0位(等于没移)然后选1行数据,输出。

2.拼接SQL语句

1.联合注入

需要使用sql中union操作符

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

如果我们输入id=-1,注意-1一般是不存在的,因此网页会返回一个空结果,我们可以利用union和另一个表项联合,这样我们就可以获取需要的数据,可以利用数据库自带的函数

常⽤函数
version()
#MySQL 版本
user()
#数据库⽤户名
database()
#数据库名
@@datadir
#数据库路径
@@version_compile_os
#操作系统版本
例如 select * from users where id='-1' union select 1,database(),3;
当然,在此之前需要先知道该表有几个数据项,这就没有啥好办法了,只能二分法来试,还好并不麻烦,使用例如 SELECT * FROM users WHERE id='1'order by 4的语句,4就是数据项数,如果大于数据项数,那么就会报错,如果小于等于,就会有正常的结果,使用二分法慢慢试吧。
再来了解 information_schema,这是 MySQL ⾃带的⼀个元数据库,⽤于存储 MySQL 的
数据结构。
元数据则是⽤于描述数据本身的数据,称为元数据,包含了,MySQL 当中有多少个数据库,
这些数据库的名称是什么,每个数据库⾥有多少个表,具体的表名叫什么
⽽ information_schema 这个库⾥⼜存放了很多个表,这些表⾥的不同字段表示 MySQL 中
的相关信息。⽽我们也可以通过 information_schema 和以上我们学习到的注⼊使⽤⽅式去查询更多的信息
例:查看 information_schema 库中 tables 表中 table_schema 等于 security 的相关信息
select table_schema,table_name from
information_schema.tables where table_schema='security';
那么我们就可以使⽤ group_concat()函数将多个数据项拼接成一个数据项,来显示我们想要的信息
group_concat()函数功能:将 where 条件匹配到的多条记录连接成⼀个字符串。
语法:group_concat (str1, str2,...)
返回结果为连接参数产⽣的字符串,如果有任何⼀个参数为 null,则返回值为 null。
例 1:使⽤ group_concat(table_name) 将 table_schema='security'匹配到的 table_name
字段值,连接成⼀个字符串。
 SELECT * FROM users WHERE id='-1' union select
1,group_concat(table_name),3 from information_schema.tables where
table_schema=database();

上述语句就是综合了union操作符和information_schema表,group_concat函数,最终我们希望能在数据库执行的sql语句,现在要做的就是构造一个语句,将上述语句通过网页注入到数据库中,结果如下所示

?id=-1' union select
1,group_concat(table_name),3 from information_schema.tables where
table_schema=database()--+

--+是注释掉后面的sql语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值