题目链接:[GXYCTF2019]BabySQli。
个人认为这道题是脑洞题(当然也跟基础业务知识不够有关)。
打开题目后环境如下。
只有一个登录框,因此常规操作,先测试一下看看。
通过多次输入不同的 UserName、password 发现,存在 admin 用户,并且可以遍历 UserName。
接下来尝试注入,发现似乎只有 Username 处可注入,而 password 处不可注入。
Payload:name=admin'&pw=admin
。
这时,留意到响应包中存在一些注释。
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
。
将其 Base32 解码,随后再 Base64 解码,得到:select * from user where username = '$name'
。
在此处,可以猜测 username 与 password 是分开验证,且一般来说,password 不会是明文比对,一般是摘要算法处理后进行比对。
继续在 username 处进行注入。
通过使用 Payload:name=admin' union select 1,2 ;#&pw=admin
,name=admin' union select 1,2,3 ;#&pw=admin
,观察响应包内容,可以发现后端查询后是返回了 3 列数据。
猜测后端是通过 md5 函数计算了前端用户提交的 password,再跟后端查询到的 SQL 结果集中的(摘要)密码进行比对,若一致,则成功登陆。因此,可以先构造一个 username 为 1(真实后端中不存在 username 为 1 的用户),从而使得 SQL 结果集为空,再通过 SQL 注入,union 拼接了其他的数据,最终实现成功登陆 admin 账户。
Payload:1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e';#&pw=123456
(e10adc3949ba59abbe56e057f20f883e
即 "123456" 的 md5 摘要)。
获得 flag。
标签:username,BabySQli,name,admin,password,GXYCTF2019,select,pw From: https://www.cnblogs.com/imtaieee/p/18538657