[GXYCTF2019]BabySQli
[GXYCTF2019]BabySQli
按正常思路,先判断是不是存在sql注入
发现存在sql注入,我们尝试一下用万能密码登录
发现可能是被过滤了,再用admin的用户名尝试登录一下
发现回显的是wrong pass!发现是存在这个admin用户的,只是密码错了
所以我们按照正常的sql注入的思路去尝试,先尝试判断列数
payload:admin'order by 5#
根据回显判断可能是过滤了order by,所以我们尝试用大小写去绕过
这里错误,发现没有5列这么多,所以我们改变列数去尝试一下
根据相应的回显判断应该是三列,再去尝试一下看看回显点在哪
发现应该是被过滤了,这里可能会没有什么思路,所以我们就去源代码里看看是不是有什么提示之类的
发现有这样一段编码,其中只有大写字母和数字,所以我们猜测它可能是base32编码,所以我们进行base32解码
解码出来是这样c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
有大小写字母,并且有==,所以我们猜测应该是base64编码,继续解码
解码结果:select * from user where username = '$name'
是一句简单的sql语句,就是根据输入的用户名来查询数据库
这里有一个关于数据库的知识点就是:在使用union进行查询的时候,即使你查询的数据不存在,数据库也会创建一个虚拟的数据放在数据库中
我写个例子来帮助我们理解一下
在这个test1表中我们可以看到只有这三条记录,但是我们这里去用union查询一下这个表里不存在的数据看一下
可以看到,即使不存在'qwe',245这条记录,也同样能够查询到数据,所以我们就可以根据这个知识点,我们去查询一下admin的密码,意思就是即使查询的密码是不存在的,数据库也会创建一个虚拟的数据进去
之前证明了数据库中是有三列,所以我们猜测这三列是id,username,password,而且一般在数据库当中,password中的数据都是用md5进行加密的,所以我们只需要去构造我们想要的密码的md5的值
我们就把密码设为123,123的md5值是'202cb962ac59075b964b07152d234b70'
md5脚本:
import hashlib a=hashlib.md5() a.update('123'.encode(encoding='utf-8')) b=a.hexdigest() print(b)
我们构造payload:1'union select 1,'admin','202cb962ac59075b964b07152d234b70'#
然后密码就是123,(这里的密码取决于你自己构造的md5的值)
登录上去,就可以获得flag了
这个payload的意思就是去查询这个admin的密码,由于union查询的那个特性,即使我们输入的密码不正确,它也会创建一个虚拟的数据(这个数据就是我们输进去的payload里的这个数)进去,就相当于我们查询的这个密码就是这个admin的密码
本文作者:Jinx8823
本文链接:https://www.cnblogs.com/Jinx8823/p/16488326.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步