知识点:
查询数据不存在时,联合查询会构造一个虚拟的数据在数据库中。
随意输入点击登录,查看源代码得到一串字符串
base32+base64解码得到:
select * from user where username = '$name'
fuzz一下发现过滤了一些字符串。首先大写绕过"Order by 3#",查询列数为3,猜测为id,username,password。
这题考察的是用户名和密码分开检验,先将username对应的字段查出来后,再检验password和查出来的密码能不能对上,这里学到一个知识点:查询数据不存在时,联合查询会构造一个虚拟的数据在数据库中。
做一个小测试。用mysql创一个表叫user,创建三个列 id,username,password,这时如果执行一个查询语句:select * from user where username = 0 union select 1,'admin',md5('abc'); 则会返回以下结果:
这样的话思路就很清晰了,我们先在用户名处输入1' union select 1,'admin','900150983cd24fb0d6963f7d28e17f72'#,在mysql中就会生成一条用户名为admin、密码为abc的MD5加密值的虚拟数据。密码处我们再输入md5加密之前的密码,也就是abc,即可绕过检验,成功登陆admin账户
最终payload:
用户名:1' union select 1,'admin','900150983cd24fb0d6963f7d28e17f72'#
密码:abc
登陆后得到flag
参考链接:https://www.jianshu.com/p/6fd932f883cd