BUUCTF [GXYCTF2019]BabySQli实战

今天继续给大家介绍CTF刷题,本文主要内容是BUUCTF [GXYCTF2019]BabySQli实战。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、题目基本情况

首先给出题目链接:https://buuoj.cn/challenges#[GXYCTF2019]BabySQli
进入该题目后,页面如下所示:
在这里插入图片描述
简单尝试,发现如果我们随便输入用户名和密码,结果如下所示:
在这里插入图片描述
如果我们在user里面输入带有"or"参数的内容,结果如下所示:
在这里插入图片描述
如果我们在user里面输入一个单引号,则会显示出当前存在的sql语句错误,如下所示:
在这里插入图片描述
然而,我们在password框里面输入引号等特殊符号,尝试构造错误时,却不会出现SQL语句执行错误。这一点我们可以分析出,我们输入的密码很有可能经过了md5等hash函数处理,因此我们的特殊符号会失效。

二、解题思路

通过简单的测试,我们可以尝试出一个可行的用户——admin,用户名输入admin后,我们随便输入密码,结果如下所示:
在这里插入图片描述
到了这一步,其实我们可以考虑爆破密码,但是本题题目提示是和SQL有关,因此我们最好先尝试SQL注入。
要进行SQL注入,登录处的SQL注入有很多方式,关键问题是,我们需要根据现有信息,推断出本题中的SQL语句
从之前的尝试,结合题目反馈我们可以得出,题目后台代码可以区分究竟是用户名错误还是密码错误。并且题目的逻辑是先验证用户名、再验证密码。因此我们可以大胆假设,本题后台代码是先根据用户的输入,通过SQL语句查询得到该用户对应的密码,然后又把SQL查询得到的密码与用户输入的密码进行比较。
对于这种登录逻辑,我们常常是使用Union联合注入的方式,构造异常SQL语句,使得查找用户名的语句查找结果为空,这样我们就可以使用Union联合注入的方式,人为的构造查询得到的密码字段。
要进行Union联合注入,首先需要确定字段数,再本题中虽然禁止输入order,但是我们可以通过select 1,2,3……等不断的尝试。最终可以确定,本题的字段数为3。这是因为我们输入name=admin’ union select 1,2,3时,题目反馈为用户名正确(即密码错误),而当输入name=admin’ union select 1,2和name=admin’ union select 1,2,3,4时,题目反馈为SQL报错语句。如下所示:
在这里插入图片描述
这样,我们得到了字段数量为3,但是我们其实并不知道,密码究竟是哪个字段。此外,我们发现name=admin1’ union select 1,2,3的执行结果如下所示:
在这里插入图片描述
这就说明,题目后台可能还存在一个验证,即使用户名的查询语句得到了结果,但是后台还有其他的验证,从而把我们查询得到的1,2,3给排除掉了。既然如此,我们就使用确定可以成功的用户admin,构造如下所示的payload:

name=admin1' union select '1','admin','3'--+&pw=123456

上述payload执行结果如下所示:
在这里插入图片描述
这样,我们就搞定username了。至于上述payload中,为什么admin在第二个字段,一方面可以通过尝试来得到;另一方面我们可以大胆猜测这3个字段分别表示id、username和password。
接下来,我们将第三个字段修改为我们输入的密码的md5值,构造payload如下所示:

name=admin1' union select 1,"admin","e10adc3949ba59abbe56e057f20f883e"--+&pw=123456

上述payload执行结果如下所示:
在这里插入图片描述
这样,我们就得到题目的flag了!
在这里插入图片描述

三、题目评析

最后,分析这道试题,个人感觉脑洞大于知识积累,关键在于猜测后台判断逻辑,多做题、见识多是对此题有帮助的。
最后,看了其他人的思路,发现题目响应数据包中有一个注释,如下所示:
在这里插入图片描述
这段注释是先用base64加密的,然后再用base32加密的,解密后,得到的结果是SQL语句。如果题目迟迟得不到思路,也可以通过尝试,来解密上述注释,以帮助我们解题。
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远是少年啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值