用户名和密码分开检验产生的mysql注入——[GXYCTF2019]BabySQli

题目已经提示了是SQli,题目是一个登陆界面,需要用户输入用户名和密码进行登陆。

首先我们可以看到返回密码错误的页面源码里有一串字符串,我们先用base32再用base64解密之后发现是mysql查询规则 select * from user where username = '$name'

进行常规mysql注入,发现1' union select 1,2,3#不会报错,说明表中有三个字段。又因为查询规则中提到有username这个字段,所以盲猜user表中包括id、username、password这三个字段。

由于题目存在过滤,我无法通过注入的方法获得表中的字段数据,所以我无法拿到准确的admin的密码。但看其他师傅说这题的考点在于用户名和密码分开检验,也就是说它是先检验username,把username对应的所有字段都查出来后,再检验密码能不能和查出来的密码对上,检验密码的过程可能会有一个md5的加密(不过我是真的不知道为什么能判断会有md5加密,大概是经验?)。

这里涉及到一个新的知识点。select * from user where username = 1 union select 1,'admin','123'查询,就算是数据库中并没有这个数据,但是查询结果还是会返回结果。




所以,我们这里可以构造用户名为 1' union select 1,'admin',md5('123')# ,然后在密码处输入123就可以实现注入。

123的MD5结果为: 202cb962ac59075b964b07152d234b70

所以最终结果为:1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#

这里的123可以替换成abc等任何值,只需要输入相应的md5值就可以了。

补充:
通过这种方法检索出来的账号密码都是我们控制的。
字段一般都是id、username、password这种顺序。
加密方式可以mysql、mysql5、md5三种试一试。

原文地址:https://www.cnblogs.com/MisakaYuii-Z/p/13243241.html