HackPluto's Blog

sqli-labs 通关详解

字数统计: 2.5k阅读时长: 9 min
2019/04/19 Share

CTF-web学习笔记之 sqli-labs
第一关:
在这里插入图片描述
第一关如图
首先可以判断这里接受的是一个GET请求,先在1后面加一个’ 发现报错,说明这里没有过滤掉引号,所以这里是一个注入点

SQL注入通常有两种类型,整形注入和字符型注入,那么判断这里是哪种注入就要分析这里的报错语句,报错信息中共有5个单引号,”实际上是两个单引号,最外面的两个是报错信息的提示引号,’1’两边的引号是后台代码的引号,多出来的就是我们加上的,因为这里给输入的1加上了引号所以后台接受的是字符型,那么我们在后续的注入中需要加 ‘ 来闭合后面的引号

接下来需要判断表中有几列,通常使用order by加数字 1 2 3 4 5一直试 直到报错为之,这里我们发现4报错了,所以这里有3列
在这里插入图片描述
id=1’ order by 4–+

接下来我们需要判断这里的回显位置,因为有三列,所以我们用
id=-1’ union select 1,2,3–+ 发现在2,3的地方可以显示出来,所以我们可以用SQL语句替代 2或者 3或者两者 来达到我们的注入目的

我们这里选择在2的位置放上SQL语句
接下来我们需要查看库名
id=-1’ union select 1,(select group_concat(schema_name) from information_schema.schemata),3–+

在这里插入图片描述
group_concat() 函数:用于将SQL语句的结果拼接在一起,如果我们的查询结果多于一个就需要将这些结果拼接出来,大家可以试一试,如果这里不使用group函数会报错,提示输出结果多于一行

information_schema 库:这个库是在MySql 5.0之后的一个库,用来存放整个数据库的信息,里面可以查询到 所有的库名,表名,列明
在这里插入图片描述
查看information_schema库的内容
在这里插入图片描述
可以看到这里有很多表,比如 schemata,columns之类的都是我们接下来要用的

查询完库名,需要查看security库中的表名
id=-1’ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=’security’),3–
发现有一个users表

查询表中的列名
id=-1’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=’users’),3–+
在这里插入图片描述

查询用户名字:
id=-1’ union select 1,(select group_concat(username) from security.users),3 –+
在这里插入图片描述
查询用户密码:
id=-1’ union select 1,(select group_concat(password) from security.users),3 –+
在这里插入图片描述
第一关就到此结束啦!

第二关:
和第一关同理,先输入’ ,报错,说明此处存在漏洞,根据报错信息,此处有三个引号说明这里是接收的是整形数据,或者这里也可以输入 2-1 或者 6-2之类的整形计算,没有报错说明这里可以进行整形计算遂判断这里是整形注入。

接下来步骤和第一关一样,这里贴出示意图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
第二关就结束啦!

第三关
在这里插入图片描述
分析报错语句,发现这里和前面不同的是多了一个括号,所以这里猜测后台查询语句为:
(‘$_GET[‘id’]’) 所以这里采用 ‘) 来闭合
在这里插入图片描述
这里补充一个知识点 limit 语句,前面我们采用的是group_concat()语句来解决输出的数据多行的问题,这里的limit 可以控制输出的行数 limit有两个参数 比如 limit 0,1就代表输出一行,偏移量为0行,可以通过改变第个行的参数来输出你希望的行

在这里插入图片描述
后面的步骤都一样
在这里插入图片描述
第三关结束

第四关
第一步还是判断注入点,这里先后加入单引号,括号均没有报错,所以尝试了双引号 果然报错,开始注入
在这里插入图片描述

在这里插入图片描述
这里分享一个绕过网站对于敏感字符过滤的方法,使用十六进制转码
在这里插入图片描述
比如这个地方,如果网站对” )等字符过滤 我们可以输入它们对应的十六进制编码,比如这里”)的十六进制为0x2229 最终网站也给我们返回了正确的信息

第四关结束

第五关

第五关上来后发现没有回显位置
在这里插入图片描述
但是可以发现存在注入点,这里可以闭合引号,随后通过查询列数发现这里也是3列
这道题使用的是报错注入
何为报错注入
报错注入就是通过人为的引起数据库的报错,但是数据库在报错的同时会将查询的结果也呈现在报错中,我在这里介绍一下报错注入以及原理
这是网上使用最广泛的一句报错注入语句:
select count(),(floor(rand(0)2))x from information_schema.tables group by x;
那么必须是要按这个句子来执行吗,或者必须要这些句子吗?
通过查找很多网站的资料,我总结出:
group by,rand(),floor()三个函数是必须存在的,缺一不可,并且rand(),rand(0)两个句子还是有一些区别的,其中rand()在两条数据以上随即报错,rand(0)在三条数据以上必报错
使用语句
union select 1,count(),concat(0x3a,0x3a,(注入语句),0x3a,0x3a,floor(rand()*2))a from information_schema.columns group by a–+
在这里插入图片描述
在这里插入图片描述
这里我发现用group_concat()会爆出的库名不全,就是用limit语句逐个爆出

在这里插入图片描述
第五关就结束啦

第六关

第六关和第五关一样也没有数据回显,所以我们这里仍然使用报错注入
实现判断注入点,输入单引号没有报错,说明此处不是单引号型注入,尝试使用双引号,报错,所以此处使用双引号闭合来注入

在这里插入图片描述
和第五关方法一样,使用报错注入
在这里插入图片描述
好!第六关到此为止!

第七关

第七关和上一关有所不同,这里说明了要使用outfile函数
outfile函数就是将数据库的查询内容导出到一个外部文件
在这里插入图片描述
show variables like ‘%secure%’;查看本机数据库的导出目录,如果随便导出到一个文件夹就会报错
在这里插入图片描述
接下来我们导出一个文件
在这里插入图片描述
查看该目录发现文件导出成功
在这里插入图片描述
接下来介绍另一个函数 dumpfile 转储函数 不过转储函数只能储存一行数据所以我们在导出的时候需要加以限制
在这里插入图片描述
还有一个函数就是load_file 下载文件,作用是从操作系统向数据库中写入文件,和前面的outfile刚好相反

在这里插入图片描述
使用该命令通常可以把服务器上的内容爆出来,当然使用的时候需要当前的权限对该文件可
读。
如何查看有没有权限,使用 (select count(*) from mysql.user)>0 如果没有报错说明有root权限
如何查看网站的路径
https://blog.csdn.net/jihaichen/article/details/80211769
当然这个题只需要对文件写入,我们选择写入一个一句话木马
在这里插入图片描述
第七关结束

第八关
在第八关,我们将学习盲注,盲注分为基于布尔的盲注和基于时间的盲注
先是判断注入类型,发现是单引号字符型注入,但是没有报错回显
在这里插入图片描述
使用报错语句没有报错,这里我们采用布尔型盲注
介绍一个函数 length() 返回字符串的长度,我们知道这个数据库名字是security总共有8位,所以我们这里使用布尔注入
在这里插入图片描述
在这里插入图片描述
可以看到=9 时就会报错 这个就是盲注的原理

第十一关
在这里插入图片描述
看到登录框,先使用弱口令进行尝试,登录成功

输入单引号尝试引起报错
在这里插入图片描述
猜测后台语句为:
select * from where username=’username’ and password=’$password’

接下来使用布尔注入,这里使用or 1=1永真句可以将所有查找结果输出
在这里插入图片描述

判断列数
在这里插入图片描述
判断回显位置
在这里插入图片描述
成功查找到信息
在这里插入图片描述

第十二关

输入单引号没有引起报错,尝试输入双引号,报错信息很多,直接看到了后台的语句
在这里插入图片描述
这里根据报错信息,使用双引号加括号闭合
在这里插入图片描述

第十三关
在这里插入图片描述
通过报错信息可以构造如下的闭合方式,
在这里插入图片描述
这一关同样是只有正确和错误两种显示,没有数据回显,所以联想到第五关的双查询注入,构造如下payload
uname=1&passwd=1’) union select count(),concat(‘‘,(select database()),’‘,floor(rand(0)2))a from information_schema.columns group by a #

第二十关
什么是cookie:
cookie是服务器给客户端的一种加密凭证,通常由客户端存储在本地,比如客户A访问 XXXX.com,网页给了客户A一个123的凭证,客户B也去访问那个网址,网站给B一个456的凭证,以后A和B去访问那个网站的时候只要加上了那个凭证网站就可以把两个人分开了。

cookie注入:
在一些网站的开发中,有的程序员为了方便会写这样的代码

1
ID = Request('id');


而request会接受来自GET,POST,COOKIE的参数而我们有时候就会忽略对于cookie的过滤

输入admin admin 进行登陆,看到返回的页面中提到了cookie的信息,使用bp改包
修改cookie的值


先加一个单引号引起报错说明这里存在注入点,判断列数为3

由于这里没有回显信息所以使用报错注入,参考前面的报错注入语句

这里再介绍一个语句 extractvalue(1,concat(0x7e,(select @@version),0x7e))
https://www.cnblogs.com/xishaonian/p/6250444.html

第二十一关

发现数据被base64加密

所以我们在进行注入的时候需要将语句先进行base64加密
判断注入点

构造payload

CATALOG