一、SUCTF easysql
方法一
第一步:没有提示,就自己尝试
首先尝试输入字母,发现页面如下
然后尝试输入数字,发现页面如下
在sql中,select语句中select后面跟着的关键字是可以用逻辑运算符的,并且逻辑运算符不同,逻辑运算符两边的判断条件不同*(比如是数字还是字符,数字是0还是大于0,字符是存在的表名还是不存在的字符串)*最终语句回显的结果也不同,由以上两点我们可以判断select后面的关键字可能是 【输入的的数据】||【数据库上的一个字段名】 或者 【输入的数据】&&【数据库上的一个字段名】。
那么大胆猜测他的语句是
select 【输入的的数据】(&&)||【字段名】 from table_name
此时我们对语句进行构造可以发现,如果我们输入"*,1“,那么语句将会变成这样
select *,1(&&)|| 【字段名】 from table_name
这句话的意思是将表中的全部信息和字段名为”1(&&)||【字段名】“的信息返回出来,如果理解不了,那可以看下图,这句话执行之后数据库不会报错,回显的信息形式如下
其实也不用深究回显会是怎样,只要知道这样构造出来的语句会回显表中的所有数据,那么在这道题中输入会有如下效果
这道题就解出来了
方法二
第二种方法,用的是堆叠注入,将sql_mode变量的值设为pipes_as_concat,这样输入的数据值为1,最后结果是一样的
二、极客大挑战 easy sql
包裹方式是单引号,username是admin,纯试出来的
三、从0到1:CTFer成长之路 sql注入-1
很标准的注入注入语句+耐心就能做出来
select group_concat(schema_name) from information_schema.schemata
select concat(table_name) from information_schema.tables where table_schema=库名
select concat(column_name) from information_schema.columns where table_name=表名
select 列名 from 表名
四、三道题做完之后的反思
思路的时候不是一撮而就的,是不断试错试出来的,这个过程需要耐心和对基础的掌握。
同时值得提醒的是,对于ctf种的sql注入来说,一开始不要想那么多,不要看题给的提示,先试试包裹,先试试字符还是数字,过度的关注提示,可能会导致过度解读,对做题反而没好处。
三道题其实都很基础,顶多suctf那道用到一个sql的特性,剩下两道一道我称之为运气,一道我称之为耐心,都是ctf中的技能呀。