[GXYCTF2019]BabySQli

题目链接:[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=adminname=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=123456e10adc3949ba59abbe56e057f20f883e 即 "123456" 的 md5 摘要)。

获得 flag。

posted @ 2024-11-10 22:33  imtaieee  阅读(1)  评论(0编辑  收藏  举报