一、什么是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
2.拼接SQL语句
1.联合注入
需要使用sql中union操作符
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
如果我们输入id=-1,注意-1一般是不存在的,因此网页会返回一个空结果,我们可以利用union和另一个表项联合,这样我们就可以获取需要的数据,可以利用数据库自带的函数
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语句。