知识点

  • 联合查询并不存在的数据时,联合查询会构造一个虚拟的数据
  • 绕过密码的md5验证

启动靶机

打开题目,是一个登录框
image.png
随便输入后点击登录就跳转到了search.php页面,查看源码可以发现一长传编码,base32再base64解密之后是 select * from user where username = '$name'

base32 和 base64 的区别:
base32 只有大写字母和数字数字组成,或者后面有三个等号。
base64 只有大写字母和数字,小写字母组成,后面一般是两个等号。

image.png

通过 1' union select 1,2,3# 获取字段数为3列。
我们在注入的时候,发现会回显“wrong user!”,但当我们是测试admin用户时却回显wrong pass!(密码错误),很明显这里绝对存在admin这个账号。此时,我们的思路就是登上admin用户或者得到admin的密码。

通过联合注入,1' union select 1,2,3# 回显 wrong user!,说明用户不在第一列
尝试将admin放在第二列的位置 1' union select 1,'admin',3#,回显 wrong pass!,得到用户名在第二列的位置。

联合注入有个技巧。在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。那么我们可以利用构造一个虚拟身份来进行伪造真实身份,从而绕过审核机制。
举个例子:最初users表中只有一行数据
image.png
我们通过union select查询就可以构造一行虚拟的数据
image.png

所以我们在用户名处输入 1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#(202cb962ac59075b964b07152d234b70为123的md5加密值,此题由于过滤了括号,所以不能用md5()函数)。在密码处输入我们自定义的密码123,即可绕过检验,成功登陆admin账户,得到flag。
image.png