[GYCTF2020]Blacklist

[GXYCTF2019]BabySQli

按正常思路,先判断是不是存在sql注入

image-20220717202134882

image-20220717202158618

发现存在sql注入,我们尝试一下用万能密码登录

image-20220717202242457

image-20220717202320525

发现可能是被过滤了,再用admin的用户名尝试登录一下

image-20220717202333576

image-20220717202339860

发现回显的是wrong pass!发现是存在这个admin用户的,只是密码错了

所以我们按照正常的sql注入的思路去尝试,先尝试判断列数

payload:admin'order by 5#

image-20220717202934695

image-20220717202943093

根据回显判断可能是过滤了order by,所以我们尝试用大小写去绕过

image-20220717203022490

image-20220717203028510

这里错误,发现没有5列这么多,所以我们改变列数去尝试一下

image-20220717203104433

image-20220717203111350

image-20220717203120705

image-20220717203125960

根据相应的回显判断应该是三列,再去尝试一下看看回显点在哪

image-20220717203409344

image-20220717203417366

发现应该是被过滤了,这里可能会没有什么思路,所以我们就去源代码里看看是不是有什么提示之类的

image-20220717203616922

发现有这样一段编码,其中只有大写字母和数字,所以我们猜测它可能是base32编码,所以我们进行base32解码

解码出来是这样c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

有大小写字母,并且有==,所以我们猜测应该是base64编码,继续解码

解码结果:select * from user where username = '$name'

是一句简单的sql语句,就是根据输入的用户名来查询数据库

这里有一个关于数据库的知识点就是:在使用union进行查询的时候,即使你查询的数据不存在,数据库也会创建一个虚拟的数据放在数据库中

我写个例子来帮助我们理解一下

image-20220717204245496

在这个test1表中我们可以看到只有这三条记录,但是我们这里去用union查询一下这个表里不存在的数据看一下

image-20220717204351361

可以看到即使,不存在'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的值)

image-20220717205350673

image-20220717205358622

登录上去,就可以获得flag了

这个payload的意思就是去查询这个admin的密码,由于union查询的那个特性,即使我们输入的密码不正确,它也会创建一个虚拟的数据(这个数据就是我们输进去的payload里的这个数)进去,就相当于我们查询的这个密码就是这个admin的密码

posted @ 2022-07-18 22:54  Jinx8823  阅读(42)  评论(0编辑  收藏  举报